ZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGM1ZTMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUzNTYxMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC54c2wuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2E1ZjM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAwLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5YU0xDb3JlUGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY3ZDU0MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICB4c2x0LXNjaGVtYXMvCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2Q4NDAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jUHJvcGVydGllcyBmaWxlIGZvciBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZwotQnVuZGxlLU5hbWUuMCA9IFhTTCBDb3JlIFBsdWctaW4gKEluY3ViYXRpbmcpCi1CdW5kbGUtVmVuZG9yLjAgPUVjbGlwc2Uub3JnCi1YU0wuQ29udGVudFR5cGUuTmFtZT1YU0wgVGVtcGxhdGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjlmMWFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLQotCTwhLS0gVGVhbSBwcm92aWRlciBpbmZvIC0tPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudGVhbS5jb3JlLmZpbGVUeXBlcyI+Ci0JCTxmaWxlVHlwZXMgdHlwZT0idGV4dCIgZXh0ZW5zaW9uPSJ4c2wiIC8+Ci0JCTxmaWxlVHlwZXMgdHlwZT0idGV4dCIgZXh0ZW5zaW9uPSJ4c2x0IiAvPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnRUeXBlcyI+Ci0JCTxjb250ZW50LXR5cGUKLQkJCWZpbGUtZXh0ZW5zaW9ucz0ieHNsLHhzbHQiCi0JCQlwcmlvcml0eT0ibm9ybWFsIgotCQkJbmFtZT0iJVhTTC5Db250ZW50VHlwZS5OYW1lIgotCQkJaWQ9InhzbHNvdXJjZSIKLQkJCWJhc2UtdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCIJCQkKLQkJCWRlZmF1bHQtY2hhcnNldD0iVVRGLTgiPgotCQkJPGRlc2NyaWJlciBjbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuWE1MUm9vdEVsZW1lbnRDb250ZW50RGVzY3JpYmVyIj4KLQkJCQk8cGFyYW1ldGVyIG5hbWU9ImVsZW1lbnQiIHZhbHVlPSJzdHlsZXNoZWV0Ii8+Ci0JCQk8L2Rlc2NyaWJlcj4KLQkJPC9jb250ZW50LXR5cGU+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPCEtLSBUaGUgbWFnaWMgd2hpY2ggZGV0ZWN0cyBYU0xUIDEuMCBvciAyLjAgc3R5bGVzaGVldHMgYW5kIHN1cHBsaWVzIHRoZSBjb3JyZWN0IFhTRCAtLT4JCi0gCTxleHRlbnNpb24KLSAgICAgICAJcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIucmVzb2x2ZXJFeHRlbnNpb25zIj4KLSAgICAJPHJlc29sdmVyRXh0ZW5zaW9uCi0gICAgICAgICAgCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUucmVzb2x2ZXIuUmVzb2x2ZXJFeHRlbnNpb24iCi0gICAgICAgIAkgIHN0YWdlPSJwcmVub3JtYWxpemF0aW9uIj4KLSAgICAJPC9yZXNvbHZlckV4dGVuc2lvbj4KLQk8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9InByb2JsZW0iCi0gICAgICAgICBuYW1lPSJYU0wgUHJvYmxlbSIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIj4KLQkJPHN1cGVyIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByb2JsZW1tYXJrZXIiLz4KLQkJPHN1cGVyIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnRleHRtYXJrZXIiLz4KLQkJPHBlcnNpc3RlbnQgdmFsdWU9InRydWUiLz4KLQkJPGF0dHJpYnV0ZSBuYW1lPSJjb2x1bW5OdW1iZXIiLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJiNzRhMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIEplc3BlciBTdGVlbiBN+GxsZXIgLSBhZGFwdGVkIGZyb20gb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5jb250ZW50Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLy8gUnVudGltZSBwbHVnaW4gbWVzc2FnZSBjYXRhbG9nCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIENvbnRlbnQgdHlwZSBtYW5hZ2VyCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgWFNMQ29yZVBsdWdpbl9wYXJzZXJDb25maWd1cmF0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgWFNMQ29yZVBsdWdpbl9iYWRJbml0aWFsaXphdGlvbkRhdGE7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYU0xDb3JlUGx1Z2luX2NvcmVFcnJvcjsKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlyZWxvYWRNZXNzYWdlcygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWxvYWRNZXNzYWdlcygpIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL1hTTENvcmVQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvWFNMQ29yZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjAyNmFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvWFNMQ29yZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSmVzcGVyIFN0ZWVuIE34bGxlciBhbmQgb3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIEplc3BlciBTdGVlbiBN+GxsZXIgLSBYU0wgY29yZSBwbHVnaW4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuY29yZTsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLm9zZ2kudXRpbC50cmFja2VyLlNlcnZpY2VUcmFja2VyOwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICovCi1wdWJsaWMgY2xhc3MgWFNMQ29yZVBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0xUX05TID0gImh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0JcHJpdmF0ZSBzdGF0aWMgWFNMQ29yZVBsdWdpbiBwbHVnaW47Ci0JCi0JcHJpdmF0ZSBTZXJ2aWNlVHJhY2tlciBwYXJzZXJUcmFja2VyID0gbnVsbDsKLQotCXByaXZhdGUgQnVuZGxlQ29udGV4dCBidW5kbGVDb250ZXh0OwotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIFhTTENvcmVQbHVnaW4oKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJYnVuZGxlQ29udGV4dCA9IGNvbnRleHQ7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKgotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgWFNMQ29yZVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQkKLQkvKgotCSAqIFJldHVybiB0aGUgcmVnaXN0ZXJlZCBTQVggcGFyc2VyIGZhY3Rvcnkgb3IgbnVsbCBpZiBvbmUKLQkgKiBkb2VzIG5vdCBleGlzdC4KLQkgKi8KLQlwdWJsaWMgU0FYUGFyc2VyRmFjdG9yeSBnZXRGYWN0b3J5KCkgewotCQlpZiAocGFyc2VyVHJhY2tlciA9PSBudWxsKSB7Ci0JCQlwYXJzZXJUcmFja2VyID0gbmV3IFNlcnZpY2VUcmFja2VyKGJ1bmRsZUNvbnRleHQsIFNBWFBhcnNlckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpLCBudWxsKTsKLQkJCXBhcnNlclRyYWNrZXIub3BlbigpOwotCQl9Ci0JCVNBWFBhcnNlckZhY3RvcnkgdGhlRmFjdG9yeSA9IChTQVhQYXJzZXJGYWN0b3J5KSBwYXJzZXJUcmFja2VyLmdldFNlcnZpY2UoKTsKLQkJaWYgKHRoZUZhY3RvcnkgIT0gbnVsbCkKLQkJCXRoZUZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0JCXJldHVybiB0aGVGYWN0b3J5OwotCX0KLQkKLQkvKioKLQkgKiBMb2dzIHRoZSBzcGVjaWZpZWQgc3RhdHVzIHdpdGggdGhpcyBwbHVnLWluJ3MgbG9nLgotCSAqIAotCSAqIEBwYXJhbSBzdGF0dXMgc3RhdHVzIHRvIGxvZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLQkJZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhzdGF0dXMpOwotCX0KLQotCS8qKgotCSAqIExvZ3MgdGhlIHNwZWNpZmllZCBleGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIGUgdGhyb3dhYmxlIHRvIGxvZyAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFRocm93YWJsZSBlKSB7Ci0JCWlmIChlIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikgewotCQkJbG9nKCgoQ29yZUV4Y2VwdGlvbillKS5nZXRTdGF0dXMoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlsb2cobmV3RXJyb3JTdGF0dXMoTWVzc2FnZXMuWFNMQ29yZVBsdWdpbl9jb3JlRXJyb3IsIGUpKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IGVycm9yIHN0YXR1cyBmb3IgdGhpcyBwbHVnLWluIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UKLQkgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUgc3RhdHVzCi0JICogQHBhcmFtIGV4Y2VwdGlvbiB0aGUgZXhjZXB0aW9uIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBzdGF0dXMgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIEByZXR1cm4gYSBuZXcgZXJyb3Igc3RhdHVzCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIG5ld0Vycm9yU3RhdHVzKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMTE5MzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIEplc3BlciBTdGVlbiBN+GxsZXIgLSBhZGFwdGVkIGZyb20gb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5jb250ZW50IAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIyMgUmVzb2x2ZXIgcHJvYmxlbXMKLVhTTENvcmVQbHVnaW5fYmFkSW5pdGlhbGl6YXRpb25EYXRhID0gSW52YWxpZCBpbml0aWFsaXphdGlvbiBkYXRhIGZvciAiezB9Ii4KLVhTTENvcmVQbHVnaW5fcGFyc2VyQ29uZmlndXJhdGlvbiA9IFhTTCBwYXJzZXIgY29uZmlndXJhdGlvbiBlcnJvciBkdXJpbmcgY29udGVudCBkZXNjcmlwdGlvbi4KLVhTTENvcmVQbHVnaW5fY29yZUVycm9yPUVycm9yIGxvZ2dlZCBmcm9tIFhTTCBjb3JlIHBsdWctaW5cOiAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvcmVzb2x2ZXIvUmVzb2x2ZXJFeHRlbnNpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvcmVzb2x2ZXIvUmVzb2x2ZXJFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFjN2E3My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL3Jlc29sdmVyL1Jlc29sdmVyRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBKZXNwZXIgU3RlZW4gTW9lbGxlciBhbmQgb3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIEplc3BlciBTdGVlbiBNb2VsbGVyIC0gWFNMIGNvcmUgcGx1Z2luCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUucmVzb2x2ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuWFNMQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFJlc29sdmVyRXh0ZW5zaW9uIGltcGxlbWVudHMgVVJJUmVzb2x2ZXJFeHRlbnNpb24gewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERvdWJsZSBERUZBVUxUX1hTTFRfVkVSU0lPTiA9IDEuMDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUFfQkFTRV9VUkkgPSAicGxhdGZvcm06L3BsdWdpbi8iICArIFhTTENvcmVQbHVnaW4uUExVR0lOX0lEICsgIi94c2x0LXNjaGVtYXMiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNMVF8xXzBfUEFUSCA9IFNDSEVNQV9CQVNFX1VSSSArICIveHNsdC0xLjAueHNkIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYU0xUXzJfMF9QQVRIID0gU0NIRU1BX0JBU0VfVVJJICsgIi94c2x0LTIuMC54c2QiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNMVF9TVFlMRVNIRUVUID0gInN0eWxlc2hlZXQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhTTFRfVEVNUExBVEUgPSAidGVtcGxhdGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhTTFRfVkVSU0lPTiA9ICJ2ZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBSZXNvbHZlckV4dGVuc2lvbigpIHsJCQotCX0KLQotCXB1YmxpYyBTdHJpbmcgcmVzb2x2ZShJRmlsZSBmaWxlLCBTdHJpbmcgYmFzZUxvY2F0aW9uLCBTdHJpbmcgcHVibGljSWQsCi0JCQlTdHJpbmcgc3lzdGVtSWQpIHsKLQotCQkvLyBJcyBzb21lb25lIGxvb2tpbmcgZm9yICJvdXIiIHNjaGVtYT8KLQkJaWYgKCEgWFNMQ29yZVBsdWdpbi5YU0xUX05TLmVxdWFscyhwdWJsaWNJZCkpIHsKLQkJCS8vIE5vdCB0aGlzIHRpbWUsIHJldHVybiByaWdodCBhd2F5Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVN0cmluZyB2ZXJzaW9uID0gbnVsbDsKLQkJCi0JCWlmIChmaWxlICE9IG51bGwpIAotCQkJdmVyc2lvbiA9IHBlZWtWZXJzaW9uQXR0cmlidXRlRnJvbVNTRShmaWxlKTsKLQkJaWYgKHZlcnNpb24gPT0gbnVsbCkKLQkJCXZlcnNpb24gPSBwZWVrVmVyc2lvbkZyb21GaWxlKGZpbGUsIGJhc2VMb2NhdGlvbik7Ci0JCQotCQlpZiAodmVyc2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlEb3VibGUgdmVyc2lvbk51bWJlciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl2ZXJzaW9uTnVtYmVyID0gRG91YmxlLnZhbHVlT2YodmVyc2lvbik7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkvLyBOb3QgaW50ZXJlc3RlZAotCQl9Ci0JCQotCQlpZiAodmVyc2lvbk51bWJlciA9PSBudWxsKSB7Ci0JCQl2ZXJzaW9uTnVtYmVyID0gREVGQVVMVF9YU0xUX1ZFUlNJT047Ci0JCX0KLQkJCi0JCS8vIFdlIGNhcmVsZXNzbHkgZGl0Y2ggdGhlIGZyYWN0aW9uIHBhcnQKLQkJaW50IGludFZlcnNpb24gPSB2ZXJzaW9uTnVtYmVyLmludFZhbHVlKCk7Ci0JCWlmIChpbnRWZXJzaW9uID09IDEpIHsKLQkJCXJldHVybiBYU0xUXzFfMF9QQVRIOwotCQl9IGVsc2UgaWYgKGludFZlcnNpb24gPT0gMikgewotCQkJcmV0dXJuIFhTTFRfMl8wX1BBVEg7Ci0JCX0KLQkJZWxzZSByZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBwZWVrVmVyc2lvbkZyb21GaWxlKElGaWxlIGZpbGUsIFN0cmluZyBiYXNlTG9jYXRpb24pIHsKLQkJWFNMVmVyc2lvbkhhbmRsZXIgaGFuZGxlciA9IG5ldyBYU0xWZXJzaW9uSGFuZGxlcigpOwotCQl0cnkgewotCQkJaGFuZGxlci5wYXJzZUNvbnRlbnRzKGZpbGUgIT0gbnVsbCA/IGNyZWF0ZUlucHV0U291cmNlKGZpbGUpIDogY3JlYXRlSW5wdXRTb3VyY2UoYmFzZUxvY2F0aW9uKSk7Ci0JCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBzZSkgewotCQkJWFNMQ29yZVBsdWdpbi5sb2coc2UpOwotCQkJLy8gZHJvcCB0aHJvdWdoLCBzaW5jZSB0aGlzIGlzIGFsbW9zdCB0byBiZSBleHBlY3RlZAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCVhTTENvcmVQbHVnaW4ubG9nKG5ldyBDb3JlRXhjZXB0aW9uKFhTTENvcmVQbHVnaW4ubmV3RXJyb3JTdGF0dXMoIkNhbid0IHBhcnNlIFhTTCBkb2N1bWVudCIsIGlvZSkpKTsgLy8kTk9OLU5MUy0xJAotCQkJLy8gZHJvcCB0aHJvdWdoLCBzaW5jZSB0aGlzIGlzIG5vdCByZWFsbHkgYSBzaG93LXN0b3BwZXIKLQkJfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBwY2UpIHsKLQkJCS8vIHNvbWUgYmFkIHRoaW5nIGhhcHBlbmVkIC0gZm9yY2UgdGhpcyBkZXNjcmliZXIgdG8gYmUgZGlzYWJsZWQKLQkJCVN0cmluZyBtZXNzYWdlID0gTWVzc2FnZXMuWFNMQ29yZVBsdWdpbl9wYXJzZXJDb25maWd1cmF0aW9uOwotCQkJWFNMQ29yZVBsdWdpbi5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBYU0xDb3JlUGx1Z2luLlBMVUdJTl9JRCwgMCwgbWVzc2FnZSwgcGNlKSk7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihtZXNzYWdlKTsKLQkJCS8vIGRyb3AgdGhyb3VnaCwgc2luY2UgdGhpcyBpcyBub3QgcmVhbGx5IGEgc2hvdy1zdG9wcGVyCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCVhTTENvcmVQbHVnaW4ubG9nKGNlKTsKLQkJCS8vIGRyb3AgdGhyb3VnaCwgc2luY2UgdGhpcyBpcyBub3QgcmVhbGx5IGEgc2hvdy1zdG9wcGVyCi0JCX0KLQotCQlTdHJpbmcgdmVyc2lvblggPSBoYW5kbGVyLmdldFZlcnNpb25BdHRyaWJ1dGUoKTsKLQkJcmV0dXJuIHZlcnNpb25YOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIHBlZWtWZXJzaW9uQXR0cmlidXRlRnJvbVNTRShJRmlsZSBmaWxlKSB7Ci0JCUlNb2RlbE1hbmFnZXIgbWFuYWdlciA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0KLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJU3RyaW5nIGlkID0gbWFuYWdlci5jYWxjdWxhdGVJZChmaWxlKTsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBtYW5hZ2VyLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGlkKTsKLQkJCXRyeSB7Ci0JCQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKSB7Ci0JCQkJCURvY3VtZW50IGRvYyA9ICgoSURPTU1vZGVsKW1vZGVsKS5nZXREb2N1bWVudCgpOwotCQkJCQlpZiAoZG9jICE9IG51bGwgJiYgZG9jLmdldERvY3VtZW50RWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCUVsZW1lbnQgZG9jdW1lbnRFbGVtZW50ID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpOwotCQkJCQkJaWYgKFhTTFRfU1RZTEVTSEVFVC5lcXVhbHMoZG9jdW1lbnRFbGVtZW50LmdldExvY2FsTmFtZSgpKSB8fAotCQkJCQkJCVhTTFRfVEVNUExBVEUuZXF1YWxzKGRvY3VtZW50RWxlbWVudC5nZXRMb2NhbE5hbWUoKSkpIHsKLQkJCQkJCQlyZXR1cm4gZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZShYU0xUX1ZFUlNJT04pOwotCQkJCQkJfSBlbHNlIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIElucHV0U291cmNlIGNyZWF0ZUlucHV0U291cmNlKFN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IElucHV0U291cmNlKHN5c3RlbUlkKTsKLQl9Ci0KLQlwcml2YXRlIElucHV0U291cmNlIGNyZWF0ZUlucHV0U291cmNlKElGaWxlIGZpbGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSW5wdXRTb3VyY2Ugc3JjID0gbmV3IElucHV0U291cmNlKGZpbGUuZ2V0Q29udGVudHMoKSk7Ci0JCXNyYy5zZXRTeXN0ZW1JZChmaWxlLmdldExvY2F0aW9uVVJJKCkudG9TdHJpbmcoKSk7Ci0JCXJldHVybiBzcmM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9yZXNvbHZlci9YU0xWZXJzaW9uSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9yZXNvbHZlci9YU0xWZXJzaW9uSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmQ4YjUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvcmVzb2x2ZXIvWFNMVmVyc2lvbkhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIEplc3BlciBTdGVlbiBN+GxsZXIgLSBhZGFwdGVkIGZyb20gb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5jb250ZW50Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUucmVzb2x2ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuWFNMQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcueG1sLnNheC4qOwotaW1wb3J0IG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi0vKioKLSAqIEEgc2ltcGxlIFhNTCBwYXJzZXIgdG8gZmluZCB0aGUgWFNMIHZlcnNpb24gb2YgYSBnaXZlbiBYTUwgZmlsZSwgZXhwZWN0ZWRseSBhIFhTTFQgc3R5bGVzaGVldC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFhTTFZlcnNpb25IYW5kbGVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgaW1wbGVtZW50cyBMZXhpY2FsSGFuZGxlciwgRXJyb3JIYW5kbGVyIHsKLQkvKioKLQkgKiBBbiBleGNlcHRpb24gaW5kaWNhdGluZyB0aGF0IHRoZSBwYXJzaW5nIHNob3VsZCBzdG9wLiBUaGlzIGlzIHVzdWFsbHkKLQkgKiB0cmlnZ2VyZWQgd2hlbiB0aGUgdG9wLWxldmVsIGVsZW1lbnQgaGFzIGJlZW4gZm91bmQuCi0JICogCi0JICogQHNpbmNlIDMuMAotCSAqLwotCXByaXZhdGUgY2xhc3MgU3RvcFBhcnNpbmdFeGNlcHRpb24gZXh0ZW5kcyBTQVhFeGNlcHRpb24gewotCQkvKioKLQkJICogQWxsIHNlcmlhbGl6YWJsZSBvYmplY3RzIHNob3VsZCBoYXZlIGEgc3RhYmxlIHNlcmlhbFZlcnNpb25VSUQKLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCS8qKgotCQkgKiBDb25zdHJ1Y3RzIGFuIGluc3RhbmNlIG9mIDxjb2RlPlN0b3BQYXJzaW5nRXhjZXB0aW9uPC9jb2RlPiB3aXRoIGEKLQkJICogPGNvZGU+bnVsbDwvY29kZT4gZGV0YWlsIG1lc3NhZ2UuCi0JCSAqLwotCQlwdWJsaWMgU3RvcFBhcnNpbmdFeGNlcHRpb24oKSB7Ci0JCQlzdXBlcigoU3RyaW5nKSBudWxsKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYU0xUX1NUWUxFU0hFRVQgPSAic3R5bGVzaGVldCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYU0xUX1RFTVBMQVRFID0gInRlbXBsYXRlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhTTFRfVkVSU0lPTiA9ICJ2ZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgdmFsdWUgb2YgdGhlIHZlcnNpb24gYXR0cmlidXRlIGluIHRoZSBYU0xUIGZpbGUuCi0JICogVGhpcyBtZW1iZXIgdmFyaWFibGUgaXMgPGNvZGU+bnVsbDwvY29kZT4gdW5sZXNzIHRoZSBmaWxlIGhhcyBiZWVuCi0JICogcGFyc2VkIHN1Y2Nlc3NmdWwgdG8gdGhlIHBvaW50IG9mIGZpbmRpbmcgdGhlIHRvcC1sZXZlbCBlbGVtZW50LAotCSAqIGFuZCBsb2NhdGluZyB0aGUgJ3ZlcnNpb24nIGF0dHJpYnV0ZSB0aGVyZS4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyB2ZXJzaW9uQXR0cmlidXRlID0gbnVsbDsKLQotCXB1YmxpYyBYU0xWZXJzaW9uSGFuZGxlcigpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlciNjb21tZW50KGNoYXJbXSwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgY29tbWVudChmaW5hbCBjaGFyW10gY2gsIGZpbmFsIGludCBzdGFydCwgZmluYWwgaW50IGxlbmd0aCkgewotCQkvLyBOb3QgaW50ZXJlc3RlZC4KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IFNBWCBwYXJzZXIgZm9yIHVzZSB3aXRoaW4gdGhpcyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIHBhcnNlci4KLQkgKiAKLQkgKiBAdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiBhIHBhcnNlciBvZiB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbiBjYW5ub3QgYmUgY3JlYXRlZC4KLQkgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIHNvbWV0aGluZyBpbiBnZW5lcmFsIGdvZXMgd3Jvbmcgd2hlbiBjcmVhdGluZyB0aGUgcGFyc2VyLgotCSAqIEB0aHJvd3MgU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIHRoZSA8Y29kZT5YTUxSZWFkZXI8L2NvZGU+IGRvZXMgbm90IHJlY29nbml6ZSB0aGUKLQkgKiAgICAgICAgICAgICBsZXhpY2FsIGhhbmRsZXIgY29uZmlndXJhdGlvbiBvcHRpb24uCi0JICogQHRocm93cyBTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGUgPGNvZGU+WE1MUmVhZGVyPC9jb2RlPiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBsZXhpY2FsCi0JICogICAgICAgICAgICAgaGFuZGxlciBjb25maWd1cmF0aW9uIG9wdGlvbi4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFNBWFBhcnNlciBjcmVhdGVQYXJzZXIoU0FYUGFyc2VyRmFjdG9yeSBwYXJzZXJGYWN0b3J5KSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uLCBTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24gewotCQkvLyBJbml0aWFsaXplIHRoZSBwYXJzZXIuCi0JCWZpbmFsIFNBWFBhcnNlciBwYXJzZXIgPSBwYXJzZXJGYWN0b3J5Lm5ld1NBWFBhcnNlcigpOwotCQlmaW5hbCBYTUxSZWFkZXIgcmVhZGVyID0gcGFyc2VyLmdldFhNTFJlYWRlcigpOwotCQlyZWFkZXIuc2V0UHJvcGVydHkoImh0dHA6Ly94bWwub3JnL3NheC9wcm9wZXJ0aWVzL2xleGljYWwtaGFuZGxlciIsIHRoaXMpOyAvLyROT04tTkxTLTEkCi0JCXJlYWRlci5zZXRFcnJvckhhbmRsZXIodGhpcyk7IC8vIFRoaXMgaGVscHMgdG8gaWdub3JlIGVycm9ycwotCQkvLyBkaXNhYmxlIERURCB2YWxpZGF0aW9uCi0JCXRyeSB7Ci0JCQkvLwliZSBzdXJlIHZhbGlkYXRpb24gaXMgIm9mZiIgb3IgdGhlIGZlYXR1cmUgdG8gaWdub3JlIERURCdzIHdpbGwgbm90IGFwcGx5Ci0JCQlyZWFkZXIuc2V0RmVhdHVyZSgiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL3ZhbGlkYXRpb24iLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJlYWRlci5zZXRGZWF0dXJlKCJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvbm9udmFsaWRhdGluZy9sb2FkLWV4dGVybmFsLWR0ZCIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uIGUpIHsKLQkJCS8vIG5vdCBhIGJpZyBkZWFsIGlmIHRoZSBwYXJzZXIgZG9lcyBub3QgcmVjb2duaXplIHRoZSBmZWF0dXJlcwotCQl9IGNhdGNoIChTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZSkgewotCQkJLy8gbm90IGEgYmlnIGRlYWwgaWYgdGhlIHBhcnNlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSBmZWF0dXJlcwotCQl9Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXIjZW5kQ0RBVEEoKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGVuZENEQVRBKCkgewotCQkvLyBOb3QgaW50ZXJlc3RlZC4KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlciNlbmREVEQoKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGVuZERURCgpIHsKLQkJLy8gTm90IGludGVyZXN0ZWQuCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXIjZW5kRW50aXR5KGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZW5kRW50aXR5KGZpbmFsIFN0cmluZyBuYW1lKSB7Ci0JCS8vIE5vdCBpbnRlcmVzdGVkLgotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbkF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIHZlcnNpb25BdHRyaWJ1dGU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGFyc2VDb250ZW50cyhJbnB1dFNvdXJjZSBjb250ZW50cykgdGhyb3dzIElPRXhjZXB0aW9uLCBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24gewotCQkvLyBQYXJzZSB0aGUgZmlsZSBpbnRvIHdlIGhhdmUgd2hhdCB3ZSBuZWVkIChvciBhbiBlcnJvciBvY2N1cnMpLgotCQl0cnkgewotCQkJU0FYUGFyc2VyRmFjdG9yeSBmYWN0b3J5ID0gWFNMQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RmFjdG9yeSgpOwotCQkJaWYgKGZhY3RvcnkgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlmaW5hbCBTQVhQYXJzZXIgcGFyc2VyID0gY3JlYXRlUGFyc2VyKGZhY3RvcnkpOwotCQkJLy8gdG8gc3VwcG9ydCBleHRlcm5hbCBlbnRpdGllcyBzcGVjaWZpZWQgYXMgcmVsYXRpdmUgVVJJcyAoc2VlIGJ1ZyA2MzI5OCkKLQkJCXBhcnNlci5wYXJzZShjb250ZW50cywgdGhpcyk7Ci0JCX0gY2F0Y2ggKFN0b3BQYXJzaW5nRXhjZXB0aW9uIGUpIHsKLQkJCS8vIEFib3J0IHRoZSBwYXJzaW5nIG5vcm1hbGx5LiBGYWxsIHRocm91Z2guLi4KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIFJlc29sdmUgZXh0ZXJuYWwgZW50aXR5IGRlZmluaXRpb25zIHRvIGFuIGVtcHR5IHN0cmluZy4gIFRoaXMgaXMgdG8gc3BlZWQKLQkgKiB1cCBwcm9jZXNzaW5nIG9mIGZpbGVzIHdpdGggZXh0ZXJuYWwgRFREcy4gIE5vdCByZXNvbHZpbmcgdGhlIGNvbnRlbnRzIAotCSAqIG9mIHRoZSBEVEQgaXMgb2ssIGFzIG9ubHkgdGhlIFN5c3RlbSBJRCBvZiB0aGUgRFREIGRlY2xhcmF0aW9uIGlzIHVzZWQuCi0JICogQHNlZSBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyI3Jlc29sdmVFbnRpdHkoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgSW5wdXRTb3VyY2UobmV3IFN0cmluZ1JlYWRlcigiIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXIjc3RhcnRDREFUQSgpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgc3RhcnRDREFUQSgpIHsKLQkJLy8gTm90IGludGVyZXN0ZWQuCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXIjc3RhcnREVEQoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgc3RhcnREVEQoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZyBwdWJsaWNJZCwgZmluYWwgU3RyaW5nIHN5c3RlbUlkKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJLy8gTm90IGludGVyZXN0ZWQuCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciNzdGFydEVsZW1lbnQoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIG9yZy54bWwuc2F4LkF0dHJpYnV0ZXMpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgc3RhcnRFbGVtZW50KGZpbmFsIFN0cmluZyB1cmksIGZpbmFsIFN0cmluZyBlbGVtZW50TmFtZSwgZmluYWwgU3RyaW5nIHF1YWxpZmllZE5hbWUsIGZpbmFsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCWlmICh1cmkuZXF1YWxzKFhTTENvcmVQbHVnaW4uWFNMVF9OUykgJiYgKFhTTFRfVEVNUExBVEUuZXF1YWxzKGVsZW1lbnROYW1lKSB8fCBYU0xUX1NUWUxFU0hFRVQuZXF1YWxzKGVsZW1lbnROYW1lKSkpIHsKLQkJCXZlcnNpb25BdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKFhTTFRfVkVSU0lPTik7Ci0JCX0gZWxzZSB7Ci0JCQl2ZXJzaW9uQXR0cmlidXRlID0gIiI7Ci0JCX0KLQkJdGhyb3cgbmV3IFN0b3BQYXJzaW5nRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXIjc3RhcnRFbnRpdHkoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBzdGFydEVudGl0eShmaW5hbCBTdHJpbmcgbmFtZSkgewotCQkvLyBOb3QgaW50ZXJlc3RlZC4KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgd2FybmluZyhTQVhQYXJzZUV4Y2VwdGlvbiBlKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJLy8gTm90IGludGVyZXN0ZWQuCi0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkvLyBOb3QgaW50ZXJlc3RlZC4KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBlKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJLy8gTm90IGludGVyZXN0ZWQuCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUveHNsdC1zY2hlbWFzL3hzbHQtMS4wLnhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3hzbHQtc2NoZW1hcy94c2x0LTEuMC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNmY3Y2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUveHNsdC1zY2hlbWFzL3hzbHQtMS4wLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE2OTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgLSBXM0MsIFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCwKLSAqIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSAyMDA3MTIyOCAtIFNUQVIgLSBVcGRhdGVkIHRvIFhNTCBTY2hlbWFzIDIwMDEgMS4wCi0gKiAgICAgICAgIE5vdGUgdGhpcyBzY2hlbWFzIGlzIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGZvciBYU0xUIDIuMCwgaXQgaGFzCi0gKiAgICAgICAgIGJlZW4gc3RyaXBwZWQgb2YgYWxsIFhTTFQgMi4wIGFkZGl0aW9ucywgdG8gYnJpbmcgaXQgaW4gbGluZSB3aXRoIHRoZSBYU0xUIDEuMAotICogICAgICAgICBzcGVjaWZpY2F0aW9uLgotICogICAgICAgICBUaGUgb3JpZ2luYWwgdmVyc2lvbiBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3d3dy53My5vcmcvMjAwNy9zY2hlbWEtZm9yLXhzbHQyMC54c2QKLSAqICAgICAgICAgVGhlIG9yaWdpbmFsIFczQyBjb3B5cmlnaHQgbm90aWNlIGlzIGluY2x1ZGVkOgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBXM0PCriBTT0ZUV0FSRSBOT1RJQ0UgQU5EIExJQ0VOU0UKLSAqIGh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvY29weXJpZ2h0LXNvZnR3YXJlLTE5OTgwNzIwCi0gKgotICogQ29weXJpZ2h0IMKpIDE5OTQtMjAwMiBXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtLCAoTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YKLSAqIFRlY2hub2xvZ3ksIEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgZW4gQXV0b21hdGlxdWUsCi0gKiBLZWlvIFVuaXZlcnNpdHkpLiBBbGwgUmlnaHRzIFJlc2VydmVkLiBodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsLwotICoKLSAqIFRoaXMgVzNDIHdvcmsgKGluY2x1ZGluZyBzb2Z0d2FyZSwgZG9jdW1lbnRzLCBvciBvdGhlciByZWxhdGVkIGl0ZW1zKSBpcyBiZWluZwotICogcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIHVuZGVyIHRoZSBmb2xsb3dpbmcgbGljZW5zZS4gQnkgb2J0YWluaW5nLAotICogdXNpbmcgYW5kL29yIGNvcHlpbmcgdGhpcyB3b3JrLCB5b3UgKHRoZSBsaWNlbnNlZSkgYWdyZWUgdGhhdCB5b3UgaGF2ZSByZWFkLAotICogdW5kZXJzdG9vZCwgYW5kIHdpbGwgY29tcGx5IHdpdGggdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9uczoKLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKLSAqIGRvY3VtZW50YXRpb24sIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sICBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlCi0gKiBvciByb3lhbHR5IGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHlvdSBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgb24gQUxMIGNvcGllcwotICogb2YgdGhlIHNvZnR3YXJlIGFuZCBkb2N1bWVudGF0aW9uIG9yIHBvcnRpb25zIHRoZXJlb2YsIGluY2x1ZGluZyBtb2RpZmljYXRpb25zLCB0aGF0Ci0gKiB5b3UgbWFrZToKLSAqCi0gKiAgMS4gVGhlIGZ1bGwgdGV4dCBvZiB0aGlzIE5PVElDRSBpbiBhIGxvY2F0aW9uIHZpZXdhYmxlIHRvIHVzZXJzIG9mIHRoZSByZWRpc3RyaWJ1dGVkCi0gKiAgICAgb3IgZGVyaXZhdGl2ZSB3b3JrLgotICogIDIuIEFueSBwcmUtZXhpc3RpbmcgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGRpc2NsYWltZXJzLCBub3RpY2VzLCBvciB0ZXJtcyBhbmQKLSAqICAgICBjb25kaXRpb25zLiBJZiBub25lIGV4aXN0LCBhIHNob3J0IG5vdGljZSBvZiB0aGUgZm9sbG93aW5nIGZvcm0gKGh5cGVydGV4dCBpcyBwcmVmZXJyZWQsIHRleHQgaXMgcGVybWl0dGVkKSBzaG91bGQgYmUgdXNlZCB3aXRoaW4gdGhlIGJvZHkgb2YgYW55IHJlZGlzdHJpYnV0ZWQgb3IgZGVyaXZhdGl2ZSBjb2RlOiAiQ29weXJpZ2h0IMKpIFskZGF0ZS1vZi1zb2Z0d2FyZV0gV29ybGQgV2lkZSBXZWIgQ29uc29ydGl1bSwgKE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgZW4gQXV0b21hdGlxdWUsIEtlaW8gVW5pdmVyc2l0eSkuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIGh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvIgotICogIDMuIE5vdGljZSBvZiBhbnkgY2hhbmdlcyBvciBtb2RpZmljYXRpb25zIHRvIHRoZSBXM0MgZmlsZXMsIGluY2x1ZGluZyB0aGUgZGF0ZSBjaGFuZ2VzCi0gKiAgICAgd2VyZSBtYWRlLiAoV2UgcmVjb21tZW5kIHlvdSBwcm92aWRlIFVSSXMgdG8gdGhlIGxvY2F0aW9uIGZyb20gd2hpY2ggdGhlIGNvZGUgaXMKLSAqICAgICBkZXJpdmVkLikKLSAqCi0gKiBUSElTIFNPRlRXQVJFIEFORCBET0NVTUVOVEFUSU9OIElTIFBST1ZJREVEICJBUyBJUywiIEFORCBDT1BZUklHSFQgSE9MREVSUyBNQUtFIE5PIAotICogUkVQUkVTRU5UQVRJT05TIE9SIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTywgCi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBTlkgUEFSVElDVUxBUiBQVVJQT1NFIE9SIFRIQVQgVEhFIFVTRSBPRgotICogVEhFIFNPRlRXQVJFIE9SIERPQ1VNRU5UQVRJT04gV0lMTCBOT1QgSU5GUklOR0UgQU5ZIFRISVJEIFBBUlRZIFBBVEVOVFMsIENPUFlSSUdIVFMsCi0gKiBUUkFERU1BUktTIE9SIE9USEVSIFJJR0hUUy4KLSAqCi0gKiBDT1BZUklHSFQgSE9MREVSUyBXSUxMIE5PVCBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBTUEVDSUFMIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgQVJJU0lORyBPVVQgT0YgQU5ZIFVTRSBPRiBUSEUgU09GVFdBUkUgT1IgRE9DVU1FTlRBVElPTi4KLSAqCi0gKiBUaGUgbmFtZSBhbmQgdHJhZGVtYXJrcyBvZiBjb3B5cmlnaHQgaG9sZGVycyBtYXkgTk9UIGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5Ci0gKiBwZXJ0YWluaW5nIHRvIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uIFRpdGxlIHRvIGNvcHlyaWdodAotICogaW4gdGhpcyBzb2Z0d2FyZSBhbmQgYW55IGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiB3aWxsIGF0IGFsbCB0aW1lcyByZW1haW4gd2l0aCBjb3B5cmlnaHQKLSAqIGhvbGRlcnMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gLS0+Ci08eHM6c2NoZW1hIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICAgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIAotICAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgCi0gICAgICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiA+Ci0KLTwhLS0gKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+Ci08eHM6YW5ub3RhdGlvbj4KLSAgPHhzOmRvY3VtZW50YXRpb24+Ci0gIAotICAgPC94czpkb2N1bWVudGF0aW9uPgotPC94czphbm5vdGF0aW9uPiAgIAotPCEtLSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KLSAKLTwhLS0KLVRoZSBkZWNsYXJhdGlvbiBvZiB4bWw6c3BhY2UgYW5kIHhtbDpsYW5nIG1heSBuZWVkIHRvIGJlIGNvbW1lbnRlZCBvdXQgYmVjYXVzZQotb2YgcHJvYmxlbXMgcHJvY2Vzc2luZyB0aGUgc2NoZW1hIHVzaW5nIHZhcmlvdXMgdG9vbHMKLS0tPgotICAgICAgCi08eHM6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiAKLSAgc2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZCIvPgotCi08IS0tICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgotPHhzOmFubm90YXRpb24+Ci0gIDx4czpkb2N1bWVudGF0aW9uPgotICAgIFBBUlQgQTogZGVmaW5pdGlvbnMgb2YgY29tcGxleCB0eXBlcyBhbmQgbW9kZWwgZ3JvdXBzIHVzZWQgYXMgdGhlIGJhc2lzIAotICAgICAgICAgICAgZm9yIGVsZW1lbnQgZGVmaW5pdGlvbnMKLSAgPC94czpkb2N1bWVudGF0aW9uPgotPC94czphbm5vdGF0aW9uPiAgIAotPCEtLSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KLQotPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImdlbmVyaWMtZWxlbWVudC10eXBlIiBtaXhlZD0idHJ1ZSI+Ci0gIDx4czphdHRyaWJ1dGUgbmFtZT0iZGVmYXVsdC1jb2xsYXRpb24iIHR5cGU9InhzbDp1cmktbGlzdCIvPgotCi0gIDx4czphdHRyaWJ1dGUgbmFtZT0iZXhjbHVkZS1yZXN1bHQtcHJlZml4ZXMiIHR5cGU9InhzbDpwcmVmaXgtbGlzdC1vci1hbGwiLz4KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJleHRlbnNpb24tZWxlbWVudC1wcmVmaXhlcyIgdHlwZT0ieHNsOnByZWZpeC1saXN0Ii8+Ci0gIDx4czphdHRyaWJ1dGUgbmFtZT0idXNlLXdoZW4iIHR5cGU9InhzbDpleHByZXNzaW9uIi8+Ci0gIDx4czphdHRyaWJ1dGUgbmFtZT0ieHBhdGgtZGVmYXVsdC1uYW1lc3BhY2UiIHR5cGU9InhzOmFueVVSSSIvPgotICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLTwveHM6Y29tcGxleFR5cGU+Ci0KLTx4czpjb21wbGV4VHlwZSBuYW1lPSJ2ZXJzaW9uZWQtZWxlbWVudC10eXBlIiBtaXhlZD0idHJ1ZSI+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDpnZW5lcmljLWVsZW1lbnQtdHlwZSI+ICAgIAotICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJ4czpkZWNpbWFsIiB1c2U9Im9wdGlvbmFsIi8+Ci0KLSAgICA8L3hzOmV4dGVuc2lvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLTwveHM6Y29tcGxleFR5cGU+Ci0KLTx4czpjb21wbGV4VHlwZSBuYW1lPSJlbGVtZW50LW9ubHktdmVyc2lvbmVkLWVsZW1lbnQtdHlwZSIgbWl4ZWQ9ImZhbHNlIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4c2w6dmVyc2lvbmVkLWVsZW1lbnQtdHlwZSI+Ci0gICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotCi08L3hzOmNvbXBsZXhUeXBlPgotCi08eHM6Y29tcGxleFR5cGUgbmFtZT0ic2VxdWVuY2UtY29uc3RydWN0b3IiPgotICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9InRydWUiPgotICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOnZlcnNpb25lZC1lbGVtZW50LXR5cGUiPiAgICAKLSAgICAgIDx4czpncm91cCByZWY9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3Rvci1ncm91cCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHM6ZXh0ZW5zaW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotPC94czpjb21wbGV4VHlwZT4KLQotPHhzOmdyb3VwIG5hbWU9InNlcXVlbmNlLWNvbnN0cnVjdG9yLWdyb3VwIj4KLSAgPHhzOmNob2ljZT4KLQotICAgIDx4czplbGVtZW50IHJlZj0ieHNsOnZhcmlhYmxlIi8+Ci0gICAgPHhzOmVsZW1lbnQgcmVmPSJ4c2w6aW5zdHJ1Y3Rpb24iLz4KLSAgICA8eHM6Z3JvdXAgcmVmPSJ4c2w6cmVzdWx0LWVsZW1lbnRzIi8+Ci0gIDwveHM6Y2hvaWNlPgotPC94czpncm91cD4KLQotPHhzOmVsZW1lbnQgbmFtZT0iZGVjbGFyYXRpb24iIHR5cGU9InhzbDpnZW5lcmljLWVsZW1lbnQtdHlwZSIgYWJzdHJhY3Q9InRydWUiLz4KLQotPHhzOmVsZW1lbnQgbmFtZT0iaW5zdHJ1Y3Rpb24iIHR5cGU9InhzbDp2ZXJzaW9uZWQtZWxlbWVudC10eXBlIiBhYnN0cmFjdD0idHJ1ZSIvPgotCi08IS0tICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgotPHhzOmFubm90YXRpb24+Ci0gIDx4czpkb2N1bWVudGF0aW9uPgotCi0gICAgUEFSVCBCOiBkZWZpbml0aW9ucyBvZiBpbmRpdmlkdWFsIFhTTFQgZWxlbWVudHMgICAgCi0gICAgRWxlbWVudHMgYXJlIGxpc3RlZCBpbiBhbHBoYWJldGljYWwgb3JkZXIuICAgIAotICA8L3hzOmRvY3VtZW50YXRpb24+Ci08L3hzOmFubm90YXRpb24+ICAgCi08IS0tICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgotCi08eHM6ZWxlbWVudCBuYW1lPSJhcHBseS1pbXBvcnRzIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmluc3RydWN0aW9uIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgIFRoaXMgY29tbWFuZCBhcHBsaWVzIHRlbXBsYXRlIHJ1bGUgZnJvbSBhbiBpbXBvcnRlZCBzdHlsZSBzaGVldC4KLSAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDplbGVtZW50LW9ubHktdmVyc2lvbmVkLWVsZW1lbnQtdHlwZSIvPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9ImFwcGx5LXRlbXBsYXRlcyIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDppbnN0cnVjdGlvbiI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICBBcHBsaWVzIHRlbXBsYXRlIHJ1bGVzIGJhc2VkIG9uIGEgZ2l2ZW4gWFBhdGggc2VsZWN0aW9uIGNyaXRlcmlhLiAgSWYgbm8gdGVtcGxhdGUKLSAgICAgICAgaXMgZm91bmQgdGhlIGJ1aWx0IGluIHRlbXBsYXRlcyBhcmUgdXNlZC4KLSAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOmVsZW1lbnQtb25seS12ZXJzaW9uZWQtZWxlbWVudC10eXBlIj4KLSAgICAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzbDpzb3J0Ii8+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4c2w6d2l0aC1wYXJhbSIvPgotICAgICAgICA8L3hzOmNob2ljZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzZWxlY3QiIHR5cGU9InhzbDpleHByZXNzaW9uIiBkZWZhdWx0PSJjaGlsZDo6bm9kZSgpIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgIE9wdGlvbmFsLiBTcGVjaWZpZXMgdGhlIFhQYXRoIGNyaXRlcmlhIHRvIGJlIHVzZWQgdG8gYXBwbHkgdGhlIHRlbXBsYXRlcy4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1vZGUiIHR5cGU9InhzbDptb2RlIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgIE9wdGlvbmFsLiAgU3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRlbXBsYXRlIHRvIGJlIHVzZWQgaWYgdGhlcmUgaXMgbW9yZSB0aGFuCi0gICAgICAgICAgICAgICAgIG9uZSB3YXkgaW4gd2hpY2ggdG8gcHJvY2VzcyB0aGUgZ2l2ZW4gY3JpdGVyaWEuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZSIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDppbnN0cnVjdGlvbiI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgRGVmaW5lcyBhbiBhdHRyaWJ1dGUgdGhhdCB3aWxsIGJlIHB1dCBpbiB0aGUgcmVzdWx0IHNldC4KLSAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0idHJ1ZSI+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3RvciI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNsOmF2dCIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgUmVxdWlyZWQuIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gYmUgY3JlYXRlZC4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHNsOmF2dCI+Ci0gICAgICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgICBPcHRpb25hbC4gVGhlIG5hbWVzcGFjZSBmb3IgdGhlIGF0dHJpYnV0ZS4KLSAgICAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4gICAgICAgIAotCi08eHM6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtc2V0IiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmRlY2xhcmF0aW9uIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICBEZWZpbmVzIGEgZ3JvdXAgb2YgYXR0cmlidXRlcyB0aGF0IHdpbGwgYmUgY3JlYXRlZCBhbmQgY2FuIGJlIHJldXNlZAotICAgICAgICAgYnkgb3RoZXIgcG9ydGlvbnMgb2YgdGhlIHN0eWxlc2hlZXQgZHVyaW5nIHByb2Nlc3NpbmcuICBUaGVzZSBhdHRyaWJ1dGVzCi0gICAgICAgICB3aWxsIGFwcGVhciBvbiB0aGUgcmVzdWx0aW5nIGRvY3VtZW50IHdoZW4gdXNlZC4KLSAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOmVsZW1lbnQtb25seS12ZXJzaW9uZWQtZWxlbWVudC10eXBlIj4KLSAgICAgICAgPHhzOnNlcXVlbmNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieHNsOmF0dHJpYnV0ZSIvPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzbDpRTmFtZSIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgUmVxdWlyZWQuICBOYW1lIG9mIHRoZSBhdHRyaWJ1dGUgc2V0LgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idXNlLWF0dHJpYnV0ZS1zZXRzIiB0eXBlPSJ4c2w6UU5hbWVzIiBkZWZhdWx0PSIiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgIEEgbGlzdCBvZiBhdHRyaWJ1dGVzLXNldHMgc2VwYXJhdGVkIGJ5IHNwYWNlcyB0byBiZSB1c2VkIGluIHRoaXMKLSAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSBzZXQuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9ImNhbGwtdGVtcGxhdGUiIHN1YnN0aXR1dGlvbkdyb3VwPSJ4c2w6aW5zdHJ1Y3Rpb24iPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgU3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgdGVtcGxhdGUgdG8gYmUgY2FsbGVkLiBBIGNhbGxlZCB0ZW1wbGF0ZQotICAgICAgICBpcyBvbmx5IGV4ZWN1dGVkIHdoZW4gaXQgaXMgY2FsbGVkLiAgSXQgaXMgbm90IGV4ZWN1dGVkIGRpcmVjdGx5IGJ5Ci0gICAgICAgIGFuIGFwcGx5LXRlbXBsYXRlcyBjb21tYW5kLgotICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLQotICA8eHM6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDplbGVtZW50LW9ubHktdmVyc2lvbmVkLWVsZW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzbDp3aXRoLXBhcmFtIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNsOlFOYW1lIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgIFJlcXVpcmVkLiAgVGhlIG5hbWUgb2YgdGhlIHRlbXBsYXRlIHRvIGJlIGNhbGxlZC4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0iY2hvb3NlIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmluc3RydWN0aW9uIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICBDaG9vc2UgaXMgdGhlIGJlZ2lubmluZyBvZiBhIFdoZW4vT3RoZXJ3aXNlIGNvbWJpbmF0aW9uLiAgSXQgaXMKLSAgICAgICAgIHRoZSB3YXkgdG8gaW1wbGVtZW50IGNhc2Ugc2VsZWN0aW9uIG9mIElmL1RoZW4vRWxzZUlmIHR5cGUgbG9naWNhbAotICAgICAgICAgcHJvY2Vzc2luZy4KLSAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDplbGVtZW50LW9ubHktdmVyc2lvbmVkLWVsZW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzbDp3aGVuIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieHNsOm90aGVyd2lzZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJjb21tZW50IiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmluc3RydWN0aW9uIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgIENyZWF0ZXMgYSBjb21tZW50IG5vZGUgaW4gdGhlIHJlc3VsdCBkb2N1bWVudC4KLSAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3IiLz4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJjb3B5IiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmluc3RydWN0aW9uIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICBDb3B5IGNyZWF0ZXMgYSBkdXBsaWNhdGUgb2YgdGhlIGN1cnJlbnQgbm9kZSBiZWluZyBwcm9jZXNzZWQuICBJdAotICAgICAgICAgZG9lcyBub3QgY29weSB0aGUgYXR0cmlidXRlcyBvciBjaGlsZHJlbiBub2Rlcy4gIFNlZSBjb3B5LW9mIGZvcgotICAgICAgICAgY29weWluZyBhdHRyaWJ1dGVzIGFuZCBjaGlsZHJlbiBub2Rlcy4KLSAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3IiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InVzZS1hdHRyaWJ1dGUtc2V0cyIgdHlwZT0ieHNsOlFOYW1lcyIgZGVmYXVsdD0iIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgIE9wdGlvbmFsLiAgQSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBhdHRyaWJ1dGVzIHNldHMgdG8gYXBwbHkgdG8gdGhlCi0gICAgICAgICAgICAgICAgIHJlc3VsdCBkb2N1bWVudC4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0iY29weS1vZiIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDppbnN0cnVjdGlvbiI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgQ3JlYXRlcyBhIGNvcHktb2YgdGhlIGN1cnJlbnQgbm9kZSBhbmQgYWxsIGF0dHJpYnV0ZXMsIGFuZCBjaGlsZHJlbiBub2Rlcy4KLSAgICAgICAgIEl0IGNvcGllcyB0aGUgbm9kZXMgc3BlY2lmaWVkIGJ5IHRoZSBYUGF0aCBzZWxlY3Rpb24gY3JpdGVyaWEuCi0gICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50IG1peGVkPSJ0cnVlIj4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOnZlcnNpb25lZC1lbGVtZW50LXR5cGUiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNlbGVjdCIgdHlwZT0ieHNsOmV4cHJlc3Npb24iIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgIFJlcXVpcmVkLiAgWFBhdGggZXhwcmVzc2lvbnMgdGhhdCBzZWxlY3QgdGhlIG5vZGVzIHRvIGJlIGNvcGllZC4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0iZGVjaW1hbC1mb3JtYXQiIHN1YnN0aXR1dGlvbkdyb3VwPSJ4c2w6ZGVjbGFyYXRpb24iPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgIERlZmluZXMgdGhlIG91dHB1dCBmb3JtYXQgdG8gYmUgdXNlZCB3aGVuIGNvbnZlcnRpbmcgbnVtYmVycyBpbnRvIHN0cmluZ3Mgd2hlbgotICAgICAgICAgdXNlZCB3aXRoIHRoZSBYUGF0aCBmdW5jdGlvbiBmb3JtYXQtbnVtYmVyKCkuCi0gICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotCi0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDplbGVtZW50LW9ubHktdmVyc2lvbmVkLWVsZW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNsOlFOYW1lIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgICBPcHRpb25hbC4gVGhlIHVuaXF1ZSBuYW1lIGZvciB0aGlzIGZvcm1hdC4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImRlY2ltYWwtc2VwYXJhdG9yIiB0eXBlPSJ4c2w6Y2hhciIgZGVmYXVsdD0iLiI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgT3B0aW9uYWwuICBUaGUgY2hhcmFjdGVyIHRvIHVzZSB0byByZXByZXNlbnQgYSBkZWNpbWFsIHBvaW50LgotICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgYSBwZXJpb2QuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJncm91cGluZy1zZXBhcmF0b3IiIHR5cGU9InhzbDpjaGFyIiBkZWZhdWx0PSIsIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgICBPcHRpb25hbC4gVGhlIGNoYXJhY3RlciB0byBiZSB1c2VkIHRvIHNlcGVyYXRlIHRob3VzYW5kcy4gIFRoZQotICAgICAgICAgICAgICAgICAgZGVmYXVsdCBpcyBhIGNvbW1hLiAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJpbmZpbml0eSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSJJbmZpbml0eSI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgT3B0aW9uYWwuIFRoZSBzdHJpbmcgdG8gYmUgdXNlZCB0byByZXByZXNlbnQgaW5maW5pdHkuIFRoZSBkZWZhdWx0Ci0gICAgICAgICAgICAgICAgICBpcyBJbmZpbml0eS4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1pbnVzLXNpZ24iIHR5cGU9InhzbDpjaGFyIiBkZWZhdWx0PSItIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgICBPcHRpb25hbC4gVGhlIGNoYXJhY3RlciB0byBiZSB1c2VkIHRvIHJlcHJlc2VudCBuZWdhdGl2ZSBudW1iZXJzLgotICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgaXMgdGhlIG1pbnVzIHNpZ24uCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJOYU4iIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iTmFOIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgICBPcHRpb25hbC4gIFRoZSBzdHJpbmcgdG8gYmUgdXNlZCB3aGVuIHRoZSBpbnB1dCBpcyBOb3QgYSBOdW1iZXIuCi0gICAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCBpcyBOYU4uCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJwZXJjZW50IiB0eXBlPSJ4c2w6Y2hhciIgZGVmYXVsdD0iJSI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgT3B0aW9uYWwuIFRoZSBjaGFyYWN0ZXIgdG8gYmUgdXNlZCB0byByZXByZXNlbnQgYSBwZXJjZW50LgotICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgaXMgYSBwZXJjZW50IHNpZ24uCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJwZXItbWlsbGUiIHR5cGU9InhzbDpjaGFyIiBkZWZhdWx0PSImI3gyMDMwOyI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgT3B0aW9uYWwuICBUaGUgY2hhcmFjdGVyIHRvIGJlIHVzZWQgdG8gcmVwcmVzZXQgcGVyIHRob3VzYW5kLgotICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgaXMgJiN4MjAzMDsKLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Inplcm8tZGlnaXQiIHR5cGU9InhzbDpjaGFyIiBkZWZhdWx0PSIwIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgICBPcHRpb25hbC4gVGhlIGNoYXJhY3RlciB0byBiZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgZGlnaXQgemVyby4KLSAgICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IGlzIHRoZSBudW1iZXIgemVyby4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImRpZ2l0IiB0eXBlPSJ4c2w6Y2hhciIgZGVmYXVsdD0iIyI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsLiBUaGUgY2hhcmFjdGVyIHRvIGJlIHVzZWQgdG8gaW5kaWNhdGVkIHdoZXJlIGEgZGlnaXQKLSAgICAgICAgICAgICAgICAgICBpcyByZXF1aXJlZC4gIFRoZSBkZWZhdWx0IHZhbHVlcyBpcyAjIGNoYXJhY3Rlci4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InBhdHRlcm4tc2VwYXJhdG9yIiB0eXBlPSJ4c2w6Y2hhciIgZGVmYXVsdD0iOyI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsLiBUaGUgY2hhcmFjdGVyIHRvIGJlIHVzZWQgdG8gc2VwYXJhdGUgcG9zaXRpdmUgYW5kCi0gICAgICAgICAgICAgICAgICAgbmVnYXRpdmUgc3ViLXBhdHRlcm5zIGluIGEgcGF0dGVybi4gIFRoZSBkZWZhdWx0IGlzIGEgc2VtaS1jb2xvbi4gICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9ImVsZW1lbnQiIHN1YnN0aXR1dGlvbkdyb3VwPSJ4c2w6aW5zdHJ1Y3Rpb24iPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgIENyZWF0ZXMgYW4gZWxlbWVudCBpbiB0aGUgcmVzdWx0IGRvY3VtZW50LgotICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmNvbXBsZXhUeXBlIG1peGVkPSJ0cnVlIj4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3RvciI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNsOmF2dCIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgUmVxdWlyZWQuICBUaGUgbmFtZSBvZiB0aGUgZWxlbWVudCB0byBiZSBjcmVhdGVkLgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJ4c2w6YXZ0Ij4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgICAgT3B0aW9uYWwuIFRoZSBuYW1lc3BhY2UgdGhlIGVsZW1lbnQgYmVsb25ncy4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InVzZS1hdHRyaWJ1dGUtc2V0cyIgdHlwZT0ieHNsOlFOYW1lcyIgZGVmYXVsdD0iIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgICAgT3B0aW9uYWwuICBBIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGF0dHJpYnV0ZS1zZXQgbmFtZXMgdG8gCi0gICAgICAgICAgICAgICAgICAgYmUgaW5jbHVkZWQgb24gdGhlIGVsZW1lbnQuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9ImZhbGxiYWNrIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmluc3RydWN0aW9uIiB0eXBlPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3IiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICBTcGVjaWZpZXMgYWx0ZXJuYXRlIGNvZGUgdG8gYmUgcnVuIGlmIHRoZSBYU0xUIHByb2Nlc3NvciBkb2Vzbid0IHVuZGVyc3RhbmQKLSAgICAgICAgICBhIHBhcnRpY3VsYXIgeHNsIGVsZW1lbnQuCi0gICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJmb3ItZWFjaCIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDppbnN0cnVjdGlvbiI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgQSBsb29waW5nIGNvbW1hbmQgdGhhdCBwcm9jZXNzZXMgZWFjaCBub2RlIHJldHVybmVkIGZyb20gdGhlCi0gICAgICAgICBYUGF0aCBzZWxlY3Rpb24gY3JpdGVyaWEuCi0gICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50IG1peGVkPSJ0cnVlIj4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOnZlcnNpb25lZC1lbGVtZW50LXR5cGUiPgotICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4c2w6c29ydCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgIDx4czpncm91cCByZWY9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3Rvci1ncm91cCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNlbGVjdCIgdHlwZT0ieHNsOmV4cHJlc3Npb24iIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgICAgUmVxdWlyZWQuICBUaGUgWFBhdGggc2VsZWN0aW9uIGNyaXRlcmlhIHRvIGJlIHVzZWQgdG8gcmV0cmlldmUgdGhlCi0gICAgICAgICAgICAgICAgICAgIG5vZGUgc2V0IHRvIGJlIHByb2Nlc3NlZCBieSB0aGUgbG9vcC4gICAgICAgICAgICAgIAotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJpZiIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDppbnN0cnVjdGlvbiI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgQSBsb2dpY2FsIGNvbnN0cnVjdCwgdGhhdCB3aWxsIG9ubHkgYmUgYXBwbGllZCB3aGVuIHRoZSBYUGF0aCBleHByZXNzaW9uCi0gICAgICAgICB0ZXN0IHJldHVybnMgdHJ1ZS4gIEl0IGRvZXMgbm90IHN1cHBvcnQgYSBFbHNlIHN0YXRlbWVudCwgc2VlIENob29zZQotICAgICAgICAgZm9yIGltcGxlbWVudGluZyBJZi9UaGVuL0Vsc2VJZiBsb2dpYy4KLSAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3IiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InRlc3QiIHR5cGU9InhzbDpleHByZXNzaW9uIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgICAgIFJlcXVpcmVkLiAgVGhlIFhQYXRoIGV4cHJlc3Npb24gdG8gdGVzdCB0aGUgdmFyaWFibGUgb3Igbm9kZSBhZ2FpbnN0LgotICAgICAgICAgICAgICAgICAgICBUaGUgc3RhdGVtZW50cyBuZXN0ZWQgd2lsbCBvbmx5IGJlIGV4ZWN1dGVkIGlmIHRoZSB0ZXN0IHJldHVybnMKLSAgICAgICAgICAgICAgICAgICAgdHJ1ZS4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0iaW1wb3J0Ij4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgIEFsbG93cyB0aGUgaW5jbHVzaW9uIG9mIG9uZSBzdHlsZXNoZWV0IGludG8gYW5vdGhlci4gIElmIHRoZXJlIGFyZQotICAgICAgICB0ZW1wbGF0ZXMgdGhhdCBhcmUgdGhlIHNhbWUgaW4gdGhlIHBhcmVudCBzdHlsZXNoZWV0IHRoYXQgYXJlIGluIHRoZQotICAgICAgICBzdHlsZXNoZWV0IGJlaW5nIGltcG9ydGVkLCB0aGUgcGFyZW50IHN0eWxlc2hlZXQncyB0ZW1wbGF0ZXMgd2lsbCAKLSAgICAgICAgdGFrZSBwcmVjZWRlbmNlLgotICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOmVsZW1lbnQtb25seS12ZXJzaW9uZWQtZWxlbWVudC10eXBlIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJocmVmIiB0eXBlPSJ4czphbnlVUkkiIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgIFJlcXVpcmVkLiAgVGhlIFVSSSBmb3IgdGhlIHN0eWxlc2hlZXQuICBUaGlzIGlzIGVpdGhlciBhIHJlbGF0aXZlCi0gICAgICAgICAgICAgICAgICBvciBwaHlzaWNhbCBVUkkuICBJZiBpdCBpcyByZWxhdGl2ZSwgaXQgaXMgcmVsYXRpdmUgdG8gdGhlIGxvY2F0aW9uCi0gICAgICAgICAgICAgICAgICBvZiB0aGUgc3R5bGVzaGVldC4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotCi08eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmRlY2xhcmF0aW9uIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICBJbmNsdWRlIGJyaW5ncyBpbiBhbm90aGVyIHN0eWxlc2hlZXQgaW50byB0aGUgY3VycmVudCBvbmUuICBVbmxpa2UKLSAgICAgICAgIHRoZSBJbXBvcnQgc3RhdGVtZW50LCB0aGUgc3R5bGVzaGVldCB0ZW1wbGF0ZXMgaGF2ZSB0aGUgc2FtZSBwcmVjZWRlbmNlCi0gICAgICAgICBhcyB0aGUgb25lIGJlaW5nIGluY2x1ZGVkIGluIHRvLgotICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOmVsZW1lbnQtb25seS12ZXJzaW9uZWQtZWxlbWVudC10eXBlIj4KLSAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImhyZWYiIHR5cGU9InhzOmFueVVSSSIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgICAgUmVxdWlyZWQuICBUaGUgVVJJIGZvciB0aGUgc3R5bGVzaGVldC4gIFRoaXMgaXMgZWl0aGVyIGEgcmVsYXRpdmUKLSAgICAgICAgICAgICAgICAgICAgIG9yIHBoeXNpY2FsIFVSSS4gIElmIGl0IGlzIHJlbGF0aXZlLCBpdCBpcyByZWxhdGl2ZSB0byB0aGUgbG9jYXRpb24KLSAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBzdHlsZXNoZWV0LgotICAgICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJrZXkiIHN1YnN0aXR1dGlvbkdyb3VwPSJ4c2w6ZGVjbGFyYXRpb24iPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgQSBrZXkgaXMgYSB3YXkgdG8gaW5kZXggYSBzZXQgb2Ygbm9kZXMgdG8gYmUgcmV0cmlldmVkIGxhdGVyIGJ5IHRoZSBYUGF0aAotICAgICAgICBrZXkoKSBmdW5jdGlvbi4gIEl0IGFsbG93cyBmYXN0ZXIgYWNjZXNzIHRvIGEgc2VyaWVzIG9mIG5vZGVzIGJhc2VkIG9mZiBvZiBhCi0gICAgICAgIHVuaXF1ZSBrZXkgd2l0aCBpbiBhIGxpc3Qgb2Ygbm9kZXMuCi0gICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3IiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzbDpRTmFtZSIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgUmVxdWlyZWQuICBUaGUgbmFtZSBvZiB0aGUga2V5IHRvIGJlIGNyZWF0ZWQuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtYXRjaCIgdHlwZT0ieHNsOnBhdHRlcm4iIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgIE9wdGlvbmFsLiAgRGVmaW5lcyB0aGUgWFBhdGggZXhwcmVzc2lvbiB0byB3aGljaCB0aGUgbm9kZXMgd2lsbAotICAgICAgICAgICAgICAgICAgYmUgYXBwbGllZC4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InVzZSIgdHlwZT0ieHNsOmV4cHJlc3Npb24iIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgICAgUmVxdWlyZWQuICBUaGUgdmFsdWUgb2YgdGhlIGtleSBmb3IgZWFjaCBvZiB0aGUgbm9kZXMuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0ibWVzc2FnZSIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDppbnN0cnVjdGlvbiI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgV3JpdGVzIGEgbWVzc2FnZSB0byB0aGUgb3V0cHV0LCB1c3VhbGx5IHN0ZG91dCBvciBzdGRlcnJvLiAgVHlwaWNhbGx5Ci0gICAgICAgICB1c2VkIHRvIHJlcG9ydCBlcnJvcnMgZHVyaW5nIHByb2Nlc3NpbmcuCi0gICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50IG1peGVkPSJ0cnVlIj4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOnNlcXVlbmNlLWNvbnN0cnVjdG9yIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0ZXJtaW5hdGUiIHR5cGU9InhzbDphdnQiIGRlZmF1bHQ9Im5vIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgICBPcHRpb25hbC4gIEluZGljYXRlcyB3aGV0aGVyIHByb2Nlc3Npbmcgc2hvdWxkIGJlIGVuZGVkIGFmdGVyCi0gICAgICAgICAgICAgICAgICBwcm9kdWNpbmcgdGhlIG1lc3NhZ2UuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBuby4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0ibmFtZXNwYWNlLWFsaWFzIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmRlY2xhcmF0aW9uIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICBBbGxvd3MgcmVwbGFjaW5nIG9mIGEgcGFydGljdWxhciBuYW1lc3BhY2UgZnJvbSB0aGUgc3R5bGUgc2hlZXQgdG8gYSBkaWZmZXJlbnQKLSAgICAgICAgIG5hbWVzcGFjZSB3aGVuIHdyaXRpbmcgdGhlIHJlc3VsdCBkb2N1bWVudC4KLSAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOmVsZW1lbnQtb25seS12ZXJzaW9uZWQtZWxlbWVudC10eXBlIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzdHlsZXNoZWV0LXByZWZpeCIgdHlwZT0ieHNsOnByZWZpeC1vci1kZWZhdWx0IiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgICBSZXF1aXJlZC4gIFNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgcHJlZml4IHlvdSB3YW50IHRvIGNoYW5nZS4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlc3VsdC1wcmVmaXgiIHR5cGU9InhzbDpwcmVmaXgtb3ItZGVmYXVsdCIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgUmVxdWlyZWQuICBTcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIHByZWZpeCB0aGUgcmVzdWx0IGlzIHRvIHVzZS4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0ibnVtYmVyIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmluc3RydWN0aW9uIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgIFVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBpbnRlZ2VyIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG5vZGUuICBBbHNvIHVzZWQKLSAgICAgICAgaW4gZm9ybWF0dGluZyBhIG51bWJlci4gICAgIAotICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLQotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50IG1peGVkPSJ0cnVlIj4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOnZlcnNpb25lZC1lbGVtZW50LXR5cGUiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2w6ZXhwcmVzc2lvbiI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgT3B0aW9uYWwuICBBIG51bWJlciBwcm92aWRlZCBieSB0aGUgaW1wbGVtZW50b3IgaW5zdGVhZCBvZgotICAgICAgICAgICAgICAgICAgYSBzeXN0ZW0gZ2VuZXJhdGVkIG51bWJlci4gIFRoZSBwb3NpdGlvbigpIHhwYXRoIGZ1bmN0aW9uIGNhbgotICAgICAgICAgICAgICAgICAgYmUgdXNlZCBhcyB3ZWxsLgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibGV2ZWwiIHR5cGU9InhzbDpsZXZlbCIgZGVmYXVsdD0ic2luZ2xlIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgIE9wdGlvbmFsLiBTcGVjaWZpZXMgaG93IHRoZSBzZXF1ZW5jZSBudW1iZXIgaXMgYXNzaWduZWQuICBWYWxpZCB2YWx1ZXMKLSAgICAgICAgICAgICAgICAgYXJlIHNpbmdsZSAoZGVmYXVsdCksIG11bHRpcGxlLCBhbmQgYW55LgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY291bnQiIHR5cGU9InhzbDpwYXR0ZXJuIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgIE9wdGlvbmFsLiAgQW4gWFBhdGggZXhwcmVzc2lvbiB0aGF0IGluZGljYXRlcyB3aGF0IG5vZGVzIGFyZSB0byBiZQotICAgICAgICAgICAgICAgICBjb3VudGVkLgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZnJvbSIgdHlwZT0ieHNsOnBhdHRlcm4iPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgT3B0aW9uYWwuICBBbiBYUGF0aCBleHByZXNzaW9uIHRoYXQgaW5kaWNhdGVzIHdoZXJlIGNvdW50aW5nIHdpbGwgc3RhcnQuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmb3JtYXQiIHR5cGU9InhzbDphdnQiIGRlZmF1bHQ9IjEiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgT3B0aW9uYWwuICBUaGUgZm9ybWF0IHN0cmluZyBpbiB3aGljaCB0aGUgbnVtYmVyIGlzIHRvIGJlIGZvcm1hdHRlZC4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImxhbmciIHR5cGU9InhzbDphdnQiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgT3B0aW9uYWwuICBUaGUgbGFuZ3VhZ2UgY29kZSB1c2VkIHRvIGluZGljYXRlIHdoYXQgc3Bva2VuIGxhbmd1YWdlIGlzCi0gICAgICAgICAgICAgICAgIHRvIGJlIHVzZWQgZm9yIHRoZSBmb3JtYXQgc3RyaW5nLgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibGV0dGVyLXZhbHVlIiB0eXBlPSJ4c2w6YXZ0Ij4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgIE9wdGlvbmFsLiAgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIG51bWJlciBpcyBhbHBoYWJldGljYWwgb3IgdHJhZGl0aW9uYWwuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJncm91cGluZy1zZXBhcmF0b3IiIHR5cGU9InhzbDphdnQiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgIE9wdGlvbmFsLiBUaGUgY2hhcmFjdGVyIHRvIGJlIHVzZWQgdG8gc2VwZXJhdGUgYSBncm91cCBvZiBudW1iZXJzLgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZ3JvdXBpbmctc2l6ZSIgdHlwZT0ieHNsOmF2dCI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgT3B0aW9uYWwuIEEgbnVtYmVyIGluZGljYXRpbmcgdGhlIG51bWJlciBvZiBkaWdpdHMgaW4gYSBncm91cC4gIFRoZQotICAgICAgICAgICAgICAgICAgZGVmYXVsdCBpcyAzLgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJvdGhlcndpc2UiIHR5cGU9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3RvciI+Ci0gICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgIE90aGVyd2lzZSBpcyB1c2VkIHRvIGluZGljYXRlIHRoZSBkZWZhdWx0IGFjdGlvbiB3aGVuIG5vbmUgb2YgdGhlIAotICAgICAgICAgV2hlbiB0ZXN0cyBhcmUgdHJ1ZSwgaW4gYSBDaG9vc2Ugc3RhdGVtZW50LgotICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICA8L3hzOmFubm90YXRpb24+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9Im91dHB1dCIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDpkZWNsYXJhdGlvbiI+Ci0gICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgIFNwZWNpZmllcyB0aGUgZm9ybWF0IGZvciB0aGUgcmVzdWx0IGRvY3VtZW50LgotICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6Z2VuZXJpYy1lbGVtZW50LXR5cGUiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1ldGhvZCIgdHlwZT0ieHNsOm1ldGhvZCI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICBPcHRpb25hbC4gIFZhbGlkIHZhbHVlcyBhcmUgeG1sLCBodG1sLCBhbmQgdGV4dC4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNkYXRhLXNlY3Rpb24tZWxlbWVudHMiIHR5cGU9InhzbDpRTmFtZXMiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgT3B0aW9uYWwuIEEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgZWxlbWVudHMgd2hvc2UgY29udGVudCBzaG91bGQKLSAgICAgICAgICAgICAgICAgYmUgd3JhcHBlZCB3aXRoIENEQVRBLiAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImRvY3R5cGUtcHVibGljIiB0eXBlPSJ4czpzdHJpbmciPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgT3B0aW9uYWwuIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBQdWJsaWMgZG9jdHlwZSBhdHRyaWJ1dGUuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkb2N0eXBlLXN5c3RlbSIgdHlwZT0ieHM6c3RyaW5nIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgIE9wdGlvbmFsLiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgU3lzdGVtIGRvY3R5cGUgYXR0cmlidXRlLgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZW5jb2RpbmciIHR5cGU9InhzOnN0cmluZyI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICBPcHRpb25hbC4gU3BlY2lmaWVzIHRoZSB0eXBlIG9mIGVuY29kaW5nIHRvIHVzZS4gIGkuZS4gVVRGLTgsIFVURi0xNiwgZXRjLgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaW5kZW50IiB0eXBlPSJ4c2w6eWVzLW9yLW5vIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgIE9wdGlvbmFsLiBTaG91bGQgdGhlIHJlc3VsdCBkb2N1bWVudCBiZSBwcmV0dHktcHJpbnRlZC4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1lZGlhLXR5cGUiIHR5cGU9InhzOnN0cmluZyI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgT3B0aW9uYWwuIFRoZSBtaW1lIHR5cGUgb2YgdGhlIHJlc3VsdCBkb2N1bWVudC4gIGkuZS4gdGV4dC94bWwKLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im9taXQteG1sLWRlY2xhcmF0aW9uIiB0eXBlPSJ4c2w6eWVzLW9yLW5vIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgICBPcHRpb25hbC4gIFdoZXRoZXIgdGhlIHhtbCBkZWNsYXRpb24gc2hvdWxkIGJlIGNyZWF0ZWQgaW4gdGhlIAotICAgICAgICAgICAgICAgICAgcmVzdWx0IGRvY3VtZW50LgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic3RhbmRhbG9uZSIgdHlwZT0ieHNsOnllcy1vci1uby1vci1vbWl0Ij4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgIE9wdGlvbmFsLiBJbmRpY2F0ZXMgaWYgYSBzdGFuZGFsb25lIGRlY2xhcnRpb24gc2hvdWxkIG9jY2N1ciBpbiB0aGUKLSAgICAgICAgICAgICAgICAgcmVzdWx0IGRvY3VtZW50LgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ieHM6Tk1UT0tFTiI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICBPcHRpb25hbC4gU2V0cyB0aGUgVzNDIHZlcnNpb24gbnVtYmVyIHRvIGJlIHVzZWQgd2l0aCB0aGUKLSAgICAgICAgICAgICAgICAgcmVzdWx0IGRvY3VtZW50LiAgT25seSB1c2VkIGZvciBIVE1MIG9yIFhNTCBvdXRwdXQuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9InBhcmFtIj4KLSAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICBVc2VkIHRvIGRlY2xhcmUgYSBsb2NhbCBvciBnbG9iYWwgcGFyYW1ldGVyLgotICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0idHJ1ZSI+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3RvciI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNsOlFOYW1lIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgICBSZXF1aXJlZC4gIFRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgdG8gYmUgY3JlYXRlZC4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNlbGVjdCIgdHlwZT0ieHNsOmV4cHJlc3Npb24iPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgIE9wdGlvbmFsLiAgQW4gWFBhdGggZXhwcmVzc2lvbiB0byBiZSB1c2VkIHRvIHBvcHVsYXRlIHRoZSBwYXJhbWV0ZXIKLSAgICAgICAgICAgICAgICAgIGlmIG5vdGhpbmcgaXMgcGFzc2VkIHRvIGl0LgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi0KLTx4czplbGVtZW50IG5hbWU9InByZXNlcnZlLXNwYWNlIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmRlY2xhcmF0aW9uIj4KLSAgIDx4czphbm5vdGF0aW9uPgotICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgSW5kaWNhdGVzIHRoZSBlbGVtZW50cyB0aGF0IGFyZSB0byBoYXZlIHdoaXRlIHNwYWNlIHByZXNlcnZlZCB3aGVuCi0gICAgICAgICBjcmVhdGluZyB0aGUgcmVzdWx0IGRvY3VtZW50LgotICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDplbGVtZW50LW9ubHktdmVyc2lvbmVkLWVsZW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZWxlbWVudHMiIHR5cGU9InhzbDpuYW1ldGVzdHMiIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgIE9wdGlvbmFsLiAgQSBzcGFjZSBzZXBlcmF0ZWQgbGlzdCBvZiBlbGVtZW50cyBpbiB3aGljaAotICAgICAgICAgICAgICAgICAgd2hpdGUgc3BhY2UgaXMgc2lnbmlmaWNhbnQgYW5kIHNob3VsZCBiZSBwcmVzZXJ2ZWQgd2hlbgotICAgICAgICAgICAgICAgICAgY3JlYXRpbmcgdGhlIHJlc3VsdCBkb2N1bWVudC4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0icHJvY2Vzc2luZy1pbnN0cnVjdGlvbiIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDppbnN0cnVjdGlvbiI+Ci0gICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgIENyZWF0ZXMgYSBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGluIHRoZSByZXN1bHQgZG9jdW1lbnQuCi0gICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0idHJ1ZSI+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3RvciI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNsOmF2dCIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICBSZXF1aXJlZC4gIFRoZSBuYW1lIG9mIHRoZSBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRvIGJlIGNyZWF0ZWQuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9InNvcnQiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgU29ydHMgdGhlIG91dHB1dCBvZiB0aGUgbm9kZSBzZXQuCi0gICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotCi0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3IiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNlbGVjdCIgdHlwZT0ieHNsOmV4cHJlc3Npb24iPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgT3B0aW9uYWwuICBTcGVjaWZpZXMgdGhlIFhQYXRoIGV4cHJlc3Npb24gdG8gYmUgdXNlZCB0byBjcmVhdGUgdGhlIG5vZGVzZXQKLSAgICAgICAgICAgICAgICAgdG8gYmUgc29ydGVkLgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+ICAKLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIiB0eXBlPSJ4c2w6YXZ0Ij4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgICBPcHRpb25hbC4gVGhlIGxhbmd1YWdlIGNvZGUgdG8gYmUgdXNlZCBmb3Igc29ydGluZy4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPiAgICAgICAgCi0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZGF0YS10eXBlIiB0eXBlPSJ4c2w6YXZ0IiBkZWZhdWx0PSJ0ZXh0Ij4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgICBPcHRpb25hbC4gIFRoZSB0eXBlIG9mIGRhdGEgdGhhdCBpcyBiZWluZyBzb3J0ZWQuIFRoZSBkZWZhdWx0Ci0gICAgICAgICAgICAgICAgICBpcyB0ZXh0LgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+ICAgICAgICAKLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJvcmRlciIgdHlwZT0ieHNsOmF2dCIgZGVmYXVsdD0iYXNjZW5kaW5nIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgICBPcHRpb25hbC4gIFRoZSBvcmRlciBpbiB3aGljaCB0aGUgZGF0YSBpcyB0byBiZSBzb3J0ZWQuICBUaGUKLSAgICAgICAgICAgICAgICAgIGRlZmF1bHQgaXMgYXNjZW5kaW5nLgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+ICAgICAgICAKLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjYXNlLW9yZGVyIiB0eXBlPSJ4c2w6YXZ0Ij4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgICBPcHRpb25hbC4gIFNwZWNpZmllcyBpZiB1cHBlciBvciBsb3dlcmNhc2UgbGV0dGVycyBhcmUgdG8gCi0gICAgICAgICAgICAgICAgICBiZSBzb3J0ZWQgZmlyc3QuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9InN0cmlwLXNwYWNlIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmRlY2xhcmF0aW9uIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgIERlZmluZXMgd2hpY2ggZWxlbWVudHMgYXJlIHRvIGhhdmUgd2hpdGUgc3BhY2Ugc3RyaXBwZWQgd2hlbgotICAgICAgICB3cml0aW5nIHRoZSByZXN1bHQgZG9jdW1lbnQuICAgICAKLSAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDplbGVtZW50LW9ubHktdmVyc2lvbmVkLWVsZW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZWxlbWVudHMiIHR5cGU9InhzbDpuYW1ldGVzdHMiIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgUmVxdWlyZWQuICBBIHNwYWNlIHNlcGFyZWF0ZWQgbGlzdCBvZiBlbGVtZW50cyBhcmUgdG8gaGF2ZQotICAgICAgICAgICAgICAgICB3aGl0ZSBzcGFjZSByZW1vdmVkIHdoZW4gd3JpdGluZyB0aGUgcmVzdWx0IGRvY3VtZW50LgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJzdHlsZXNoZWV0IiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOnRyYW5zZm9ybSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgVGhlIHJvb3QgZWxlbWVudCBvZiBhIHN0eWxlIHNoZWV0LiAgQWxzbyBzZWUgdGhlIHRyYW5zZm9ybSBlbGVtZW50LgotICAgICAgICAgRWl0aGVyIHN0eWxlc2hlZXQgb3IgdHJhbnNmb3JtIGNhbiBiZSB1c2VkLiAgVHlwaWNhbGx5IHN0eWxzaGVldCBpcwotICAgICAgICAgdXNlZC4KLSAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9InRlbXBsYXRlIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmRlY2xhcmF0aW9uIj4KLSAgIDx4czphbm5vdGF0aW9uPgotICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICBBIHRlbXBsYXRlIGNvbnRhaW5zIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIGFuZCBjb21tYW5kcyBmb3Igbm9kZXMgaW4gdGhlCi0gICAgICAgIGlucHV0IGRvY3VtZW50IHRoYXQgbWF0Y2ggdGhlIHNwZWNpZmllZCBYUGF0aCBleHByZXNzaW9uLgotICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6dmVyc2lvbmVkLWVsZW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzbDpwYXJhbSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgIDx4czpncm91cCByZWY9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3Rvci1ncm91cCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1hdGNoIiB0eXBlPSJ4c2w6cGF0dGVybiI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICBPcHRpb25hbC4gQW4gWFBhdGggZXhwcmVzc2lvbiBvciBleHByZXNzaW9ucyB0aGF0IHRoaXMgdGVtcGxhdGUgd2lsbAotICAgICAgICAgICAgICAgICBiZSBhcHBsaWVkIHRvLiAgTm90ZSBpZiB0aGlzIGlzIG9taXR0ZWQsIHRoZW4gYSBuYW1lIGF0dHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgICAgICAgIGJlIHVzZWQuICBFaXRoZXIgYSBuYW1vZSBvciBhIG1hdGNoIGFyZSB0byBiZSB1c2VkLCBidXQgbm90IGJvdGguCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJwcmlvcml0eSIgdHlwZT0ieHM6ZGVjaW1hbCI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgT3B0aW9uYWwuICBJbmRpY2F0ZXMgdGhlIG51bWVyaWMgcHJpb3J0aXR5IGZvciBwcm9jZXNzaW5nIHRoZQotICAgICAgICAgICAgICAgICAgdGVtcGxhdGUuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtb2RlIiB0eXBlPSJ4c2w6bW9kZXMiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgIE9wdGlvbmFsLiAgVGhlIG5hbWUgb2YgdGhlIG1vZGUgZm9yIHRoaXMgdGVtcGxhdGUuICBVc2VkIHRvIG1hdGNoCi0gICAgICAgICAgICAgICAgICB1cCB3aXRoIHRoZSBhcHBseS10ZW1wbGF0ZXMgbW9kZSBhdHRyaWJ1dGUuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2w6UU5hbWUiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgIE9wdGlvbmFsLiAgVGhlIG5hbWUgb2YgYSBjYWxsZWQgdGVtcGxhdGUuICBOb3RlIHRoYXQgaWYgbmFtZSBpcwotICAgICAgICAgICAgICAgICAgbm90IHVzZWQsIHRoZW4gbWF0Y2ggbXVzdCBiZSB1c2VkLiAgWW91IGNhbiBoYXZlIG9uZSBvciB0aGUgb3RoZXIKLSAgICAgICAgICAgICAgICAgIGJ1dCBub3QgYm90aC4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRleHQtZWxlbWVudC1iYXNlLXR5cGUiPgotICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHNsOnZlcnNpb25lZC1lbGVtZW50LXR5cGUiPgotCi0gICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyIvPgotICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVDb250ZW50PgotPC94czpjb21wbGV4VHlwZT4KLQotPHhzOmVsZW1lbnQgbmFtZT0idGV4dCIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDppbnN0cnVjdGlvbiI+Ci0gICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgV3JpdGVzIHRleHQgZGF0YSB0byB0aGUgb3V0cHV0LiAgaS5lLiAjUENEYXRhCi0gICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6dGV4dC1lbGVtZW50LWJhc2UtdHlwZSI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmciIHR5cGU9InhzbDp5ZXMtb3Itbm8iIGRlZmF1bHQ9Im5vIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgIE9wdGlvbmFsLiAgSW5kaWNhdGVzIGlmIG5vbiBmcmllbmRseSBodG1sIGFuZCB4bWwgY29udGVudCBzaG91bGQgYmUgY29udmVydGVkCi0gICAgICAgICAgICAgICAgIHRvIHRoZWlyIGVudGl0eSB0eXBlcy4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNmb3JtLWVsZW1lbnQtYmFzZS10eXBlIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4c2w6ZWxlbWVudC1vbmx5LXZlcnNpb25lZC1lbGVtZW50LXR5cGUiPgotICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJ4czpkZWNpbWFsIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgIFJlcXVpcmVkLiAgVGhlIHZlcnNpb24gbnVtYmVyIGNvcnJlc3BvbmRpbmcgdGhlIHRoZQotICAgICAgICAgICAgICAgICBYU0xUIHNwZWNpZmljYXRpb24gYmVpbmcgdXNlZC4gIEZvciBYU0xUIDEuMCwgdGhpcyB3aWxsCi0gICAgICAgICAgICAgICAgIGJlIDEuMC4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci08L3hzOmNvbXBsZXhUeXBlPgotCi08eHM6ZWxlbWVudCBuYW1lPSJ0cmFuc2Zvcm0iPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgIFRoZSByb290IGVsZW1lbnQgb2YgYSBzdHlsZSBzaGVldC4gIEFsc28gc2VlIHRoZSBzdHlsZXNoZWV0IGVsZW1lbnQuCi0gICAgICAgICBFaXRoZXIgc3R5bGVzaGVldCBvciB0cmFuc2Zvcm0gY2FuIGJlIHVzZWQuICBUeXBpY2FsbHkgc3R5bHNoZWV0IGlzCi0gICAgICAgICB1c2VkLgotICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOnRyYW5zZm9ybS1lbGVtZW50LWJhc2UtdHlwZSI+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzbDppbXBvcnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4c2w6ZGVjbGFyYXRpb24iLz4KLSAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieHNsOnZhcmlhYmxlIi8+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzbDpwYXJhbSIvPiAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4gPCEtLSB3ZWFrZXIgdGhhbiBYU0xUIDEuMCAtLT4KLSAgICAgICAgICA8L3hzOmNob2ljZT4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHM6SUQiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgT3B0aW9uYWwuICBBIHVuaXF1ZSBJRCBmb3IgdGhlIHN0eWxlc2hlZXQuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9InZhbHVlLW9mIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmluc3RydWN0aW9uIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgIFVzZWQgdG8gcHVsbCB0aGUgZGF0YSB2YWx1ZSBmcm9tIHRoZSBzZWxlY3RlZCBub2RlIG9yIFhQYXRoIGV4cHJlc3Npb24uCi0gICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotCi0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3IiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNlbGVjdCIgdHlwZT0ieHNsOmV4cHJlc3Npb24iIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgUmVxdWlyZWQuICBUaGUgWFBhdGggZXhwcmVzc2lvbiBvciBjdXJyZW50IG5vZGUgdG8gYmUgdXNlZAotICAgICAgICAgICAgICAgICB0byBwdWxsIHRoZSBkYXRhIGZyb20uCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkaXNhYmxlLW91dHB1dC1lc2NhcGluZyIgdHlwZT0ieHNsOnllcy1vci1ubyIgZGVmYXVsdD0ibm8iPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgIE9wdGlvbmFsLiBXaGV0aGVyIG5vbi14bWwgZnJpZW5kbHkgZGF0YSBzaG91bGQgYmUgZW50aXR5IGVzY2FwZWQuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9InZhcmlhYmxlIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgIERlY2xhcmVzIGEgbG9jYWwgb3IgZ2xvYmFsIHZhcmlhYmxlIHRvIGJlIHVzZWQgZHVyaW5nIHByb2Nlc3NpbmcuCi0gICAgICAgIFRoZSBjb250ZW50cyBvZiB2YXJpYWJsZSBjYW4gYmUgcG9wdWxhdGVkIGJ5IGVpdGhlciBhIHNlcmllcyBvZgotICAgICAgICBYU0xUIGNvbW1hbmRzIG9yIFhQYXRoIGV4cHJlc3Npb25zLgotICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLQotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50IG1peGVkPSJ0cnVlIj4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOnNlcXVlbmNlLWNvbnN0cnVjdG9yIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2w6UU5hbWUiIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgUmVxdWlyZWQuICBUaGUgbmFtZSBvZiB0aGUgdmFyaWFibGUuICBUaGlzIGlzIGhvdyB0aGUKLSAgICAgICAgICAgICAgICAgdmFyaWFibGUgaXMgYWNjZXNzZWQgbGF0ZXIgaW4gdGhlIHN0eWxlc2hlZXQuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzZWxlY3QiIHR5cGU9InhzbDpleHByZXNzaW9uIiB1c2U9Im9wdGlvbmFsIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgICBPcHRpb25hbC4gIFRoZSBYUGF0aCBleHByZXNzaW9uIGluIHdoaWNoIHRoZSB2YXJpYWJsZSBpcwotICAgICAgICAgICAgICAgICAgcG9wdWxhdGVkIGZyb20uICBUaGlzIHNwZWNpZmllcyB3aGVyZSB0aGUgdmFyaWFibGUgaXMgdG8gZ2V0Ci0gICAgICAgICAgICAgICAgICBpdCdzIGRhdGEgdmFsdWUgZnJvbS4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0id2hlbiI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgQSBjb25kaXRpb25hbCBzdGF0ZW1lbnQgc2ltaWxpYXIgdG8gYW4gaWYgc3RhdGVtZW50LCB1c2VkIHRvIHRlc3QKLSAgICAgICAgIGlmIGEgcGFydGljdWxhciBleHByZXNzaW9uIGlzIHRydWUgb3IgZmFsc2UuICBVc2Ugd2l0aCB0aGUgQ2hvb3NlIGFuZAotICAgICAgICAgT3RoZXIgd2lzZSBlbGVtZW50cy4KLSAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0idHJ1ZSI+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3RvciI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idGVzdCIgdHlwZT0ieHNsOmV4cHJlc3Npb24iIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgQW4gWFBhdGggZXhwcmVzc2lvbiB0aGF0IHRlc3RzIHRvIHRydWUgb3IgZmFsc2UuICBJZiB0cnVlCi0gICAgICAgICAgICAgICAgIHRoZSBzdGF0ZW1lbnRzIHdpdGhpbiBhcmUgZXhlY3V0ZWQuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9IndpdGgtcGFyYW0iPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgRGVmaW5lcyB0aGUgdmFsdWUgb2YgYSBwYXJhbWV0ZXIgdG8gYmUgcGFzc2VkIHRvIGEgY2FsbGVkIHRlbXBsYXRlLgotICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLQotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50IG1peGVkPSJ0cnVlIj4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOnNlcXVlbmNlLWNvbnN0cnVjdG9yIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2w6UU5hbWUiIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgIFJlcXVpcmVkLiAgVGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciB0byBiZSBzZXQuICBUaGlzCi0gICAgICAgICAgICAgICAgICBtdXN0IGV4aXN0IGluIHRoZSB0ZW1wbGF0ZSB0aGF0IGlzIGJlaW5nIGNhbGxlZC4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNlbGVjdCIgdHlwZT0ieHNsOmV4cHJlc3Npb24iPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgIE9wdGlvbmFsLiAgQW4gWFBhdGggZXhwcmVzc2lvbiB0aGF0IGlzIHVzZWQgdG8gc2V0Ci0gICAgICAgICAgICAgICAgICB0aGUgdmFsdWUgZm9yIHRoZSBwYXJhbWV0ZXIgYmVpbmcgcGFzc2VkIHRvIGEgdGVtcGxhdGUuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTwhLS0gKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+Ci08eHM6YW5ub3RhdGlvbj4KLSAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgUEFSVCBDOiBkZWZpbml0aW9uIG9mIGxpdGVyYWwgcmVzdWx0IGVsZW1lbnRzCi0gICAgCi0gICAgVGhlcmUgYXJlIHRocmVlIHdheXMgdG8gZGVmaW5lIHRoZSBsaXRlcmFsIHJlc3VsdCBlbGVtZW50cwotICAgIHBlcm1pc3NpYmxlIGluIGEgc3R5bGVzaGVldC4KLSAgICAKLSAgICAoYSkgZG8gbm90aGluZy4gVGhpcyBhbGxvd3MgYW55IGVsZW1lbnQgdG8gYmUgdXNlZCBhcyBhIGxpdGVyYWwKLSAgICAgICAgcmVzdWx0IGVsZW1lbnQsIHByb3ZpZGVkIGl0IGlzIG5vdCBpbiB0aGUgWFNMVCBuYW1lc3BhY2UKLSAgICAKLSAgICAoYikgZGVjbGFyZSBhbGwgcGVybWl0dGVkIGxpdGVyYWwgcmVzdWx0IGVsZW1lbnRzIGFzIG1lbWJlcnMKLSAgICAgICAgb2YgdGhlIHhzbDpsaXRlcmFsLXJlc3VsdC1lbGVtZW50IHN1YnN0aXR1dGlvbiBncm91cAotICAgICAgICAKLSAgICAoYykgcmVkZWZpbmUgdGhlIG1vZGVsIGdyb3VwIHhzbDpyZXN1bHQtZWxlbWVudHMgdG8gYWNjb21tb2RhdGUKLSAgICAgICAgYWxsIHBlcm1pdHRlZCBsaXRlcmFsIHJlc3VsdCBlbGVtZW50cy4KLSAgICAgICAgCi0gICAgTGl0ZXJhbCByZXN1bHQgZWxlbWVudHMgYXJlIGFsbG93ZWQgdG8gdGFrZSBjZXJ0YWluIGF0dHJpYnV0ZXMKLSAgICBpbiB0aGUgWFNMVCBuYW1lc3BhY2UuIFRoZXNlIGFyZSBkZWZpbmVkIGluIHRoZSBhdHRyaWJ1dGUgZ3JvdXAKLSAgICBsaXRlcmFsLXJlc3VsdC1lbGVtZW50LWF0dHJpYnV0ZXMsIHdoaWNoIGNhbiBiZSBpbmNsdWRlZCBpbiB0aGUKLSAgICBkZWZpbml0aW9uIG9mIGFueSBsaXRlcmFsIHJlc3VsdCBlbGVtZW50LgotICAgIAotICA8L3hzOmRvY3VtZW50YXRpb24+Ci0KLTwveHM6YW5ub3RhdGlvbj4gICAKLTwhLS0gKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+Ci0KLTx4czplbGVtZW50IG5hbWU9ImxpdGVyYWwtcmVzdWx0LWVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiB0eXBlPSJ4czphbnlUeXBlIi8+Ci0KLTx4czphdHRyaWJ1dGVHcm91cCBuYW1lPSJsaXRlcmFsLXJlc3VsdC1lbGVtZW50LWF0dHJpYnV0ZXMiPgotICA8eHM6YXR0cmlidXRlIG5hbWU9ImRlZmF1bHQtY29sbGF0aW9uIiBmb3JtPSJxdWFsaWZpZWQiIHR5cGU9InhzbDp1cmktbGlzdCIvPgotICA8eHM6YXR0cmlidXRlIG5hbWU9ImV4dGVuc2lvbi1lbGVtZW50LXByZWZpeGVzIiBmb3JtPSJxdWFsaWZpZWQiIHR5cGU9InhzbDpwcmVmaXhlcyIvPgotICA8eHM6YXR0cmlidXRlIG5hbWU9ImV4Y2x1ZGUtcmVzdWx0LXByZWZpeGVzIiBmb3JtPSJxdWFsaWZpZWQiIHR5cGU9InhzbDpwcmVmaXhlcyIvPgotICA8eHM6YXR0cmlidXRlIG5hbWU9InhwYXRoLWRlZmF1bHQtbmFtZXNwYWNlIiBmb3JtPSJxdWFsaWZpZWQiIHR5cGU9InhzOmFueVVSSSIvPiAgICAKLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJpbmhlcml0LW5hbWVzcGFjZXMiIGZvcm09InF1YWxpZmllZCIgdHlwZT0ieHNsOnllcy1vci1ubyIgZGVmYXVsdD0ieWVzIi8+Ci0gIDx4czphdHRyaWJ1dGUgbmFtZT0idXNlLWF0dHJpYnV0ZS1zZXRzIiBmb3JtPSJxdWFsaWZpZWQiIHR5cGU9InhzbDpRTmFtZXMiIGRlZmF1bHQ9IiIvPgotCi0gIDx4czphdHRyaWJ1dGUgbmFtZT0idXNlLXdoZW4iIGZvcm09InF1YWxpZmllZCIgdHlwZT0ieHNsOmV4cHJlc3Npb24iLz4KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiBmb3JtPSJxdWFsaWZpZWQiIHR5cGU9InhzOmRlY2ltYWwiLz4KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiBmb3JtPSJxdWFsaWZpZWQiIHR5cGU9InhzbDpRTmFtZSIvPgotICA8eHM6YXR0cmlidXRlIG5hbWU9InZhbGlkYXRpb24iIGZvcm09InF1YWxpZmllZCIgdHlwZT0ieHNsOnZhbGlkYXRpb24tdHlwZSIvPgotPC94czphdHRyaWJ1dGVHcm91cD4KLQotPHhzOmdyb3VwIG5hbWU9InJlc3VsdC1lbGVtZW50cyI+Ci0gIDx4czpjaG9pY2U+Ci0gICAgPHhzOmVsZW1lbnQgcmVmPSJ4c2w6bGl0ZXJhbC1yZXN1bHQtZWxlbWVudCIvPgotICAgIDx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotCi0gICAgPHhzOmFueSBuYW1lc3BhY2U9IiMjbG9jYWwiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gIDwveHM6Y2hvaWNlPgotPC94czpncm91cD4KLQotCi08IS0tICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgotPHhzOmFubm90YXRpb24+Ci0gIDx4czpkb2N1bWVudGF0aW9uPgotICAgIFBBUlQgRDogZGVmaW5pdGlvbnMgb2Ygc2ltcGxlIHR5cGVzIHVzZWQgaW4gc3R5bGVzaGVldCBhdHRyaWJ1dGVzIAotICA8L3hzOmRvY3VtZW50YXRpb24+Ci08L3hzOmFubm90YXRpb24+ICAgCi08IS0tICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgotCi08eHM6c2ltcGxlVHlwZSBuYW1lPSJhdnQiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIFRoaXMgdHlwZSBpcyB1c2VkIGZvciBhbGwgYXR0cmlidXRlcyB0aGF0IGFsbG93IGFuIGF0dHJpYnV0ZSB2YWx1ZSB0ZW1wbGF0ZS4KLSAgICAgIFRoZSBnZW5lcmFsIHJ1bGVzIGZvciB0aGUgc3ludGF4IG9mIGF0dHJpYnV0ZSB2YWx1ZSB0ZW1wbGF0ZXMsIGFuZCB0aGUgc3BlY2lmaWMKLSAgICAgIHJ1bGVzIGZvciBlYWNoIHN1Y2ggYXR0cmlidXRlLCBhcmUgZGVzY3JpYmVkIGluIHRoZSBYU0xUIDIuMCBSZWNvbW1lbmRhdGlvbi4KLSAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyIvPgotPC94czpzaW1wbGVUeXBlPgotCi08eHM6c2ltcGxlVHlwZSBuYW1lPSJjaGFyIj4KLSAgPHhzOmFubm90YXRpb24+Ci0KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIEEgc3RyaW5nIGNvbnRhaW5pbmcgZXhhY3RseSBvbmUgY2hhcmFjdGVyLgotICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLSAgICA8eHM6bGVuZ3RoIHZhbHVlPSIxIi8+Ci0gIDwveHM6cmVzdHJpY3Rpb24+Ci08L3hzOnNpbXBsZVR5cGU+Ci0KLTx4czpzaW1wbGVUeXBlIG5hbWU9ImV4cHJlc3Npb24iPgotICA8eHM6YW5ub3RhdGlvbj4KLQotICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgQW4gWFBhdGggMi4wIGV4cHJlc3Npb24uCi0gICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+Ci0gICAgPHhzOnBhdHRlcm4gdmFsdWU9Ii4rIi8+Ci0gIDwveHM6cmVzdHJpY3Rpb24+Ci08L3hzOnNpbXBsZVR5cGU+Ci0KLTx4czpzaW1wbGVUeXBlIG5hbWU9ImlucHV0LXR5cGUtYW5ub3RhdGlvbnMtdHlwZSI+Ci0gIDx4czphbm5vdGF0aW9uPgotCi0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBEZXNjcmliZXMgaG93IHR5cGUgYW5ub3RhdGlvbnMgaW4gc291cmNlIGRvY3VtZW50cyBhcmUgaGFuZGxlZC4KLSAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KLSAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InByZXNlcnZlIi8+Ci0gICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJzdHJpcCIvPiAgIAotICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0idW5zcGVjaWZpZWQiLz4gICAgICAgIAotICA8L3hzOnJlc3RyaWN0aW9uPgotPC94czpzaW1wbGVUeXBlPgotCi08eHM6c2ltcGxlVHlwZSBuYW1lPSJsZXZlbCI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgVGhlIGxldmVsIGF0dHJpYnV0ZSBvZiB4c2w6bnVtYmVyOiAKLSAgICAgIG9uZSBvZiBzaW5nbGUsIG11bHRpcGxlLCBvciBhbnkuCi0gICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOQ05hbWUiPgotICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ic2luZ2xlIi8+Ci0gICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJtdWx0aXBsZSIvPgotICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iYW55Ii8+Ci0KLSAgPC94czpyZXN0cmljdGlvbj4KLTwveHM6c2ltcGxlVHlwZT4KLQotPHhzOnNpbXBsZVR5cGUgbmFtZT0ibW9kZSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgVGhlIG1vZGUgYXR0cmlidXRlIG9mIHhzbDphcHBseS10ZW1wbGF0ZXM6IAotICAgICAgZWl0aGVyIGEgUU5hbWUsIG9yICNjdXJyZW50LCBvciAjZGVmYXVsdC4KLSAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOnVuaW9uIG1lbWJlclR5cGVzPSJ4c2w6UU5hbWUiPgotICAgIDx4czpzaW1wbGVUeXBlPgotCi0gICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IiNkZWZhdWx0Ii8+Ci0gICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iI2N1cnJlbnQiLz4KLSAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgPC94czpzaW1wbGVUeXBlPgotICA8L3hzOnVuaW9uPgotPC94czpzaW1wbGVUeXBlPgotCi08eHM6c2ltcGxlVHlwZSBuYW1lPSJtb2RlcyI+Ci0gIDx4czphbm5vdGF0aW9uPgotCi0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBUaGUgbW9kZSBhdHRyaWJ1dGUgb2YgeHNsOnRlbXBsYXRlOiAKLSAgICAgIGVpdGhlciBhIGxpc3QsIGVhY2ggbWVtYmVyIGJlaW5nIGVpdGhlciBhIFFOYW1lIG9yICNkZWZhdWx0OwotICAgICAgb3IgdGhlIHZhbHVlICNhbGwKLSAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOnVuaW9uPgotICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgPHhzOmxpc3Q+Ci0gICAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgICAgIDx4czp1bmlvbiBtZW1iZXJUeXBlcz0ieHNsOlFOYW1lIj4KLQotICAgICAgICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+Ci0gICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIjZGVmYXVsdCIvPgotICAgICAgICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICAgICAgIDwveHM6dW5pb24+Ci0gICAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICAgIDwveHM6bGlzdD4KLSAgICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+Ci0gICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iI2FsbCIvPgotICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gIDwveHM6dW5pb24+Ci08L3hzOnNpbXBsZVR5cGU+Ci0KLTx4czpzaW1wbGVUeXBlIG5hbWU9Im5hbWV0ZXN0cyI+Ci0gIDx4czphbm5vdGF0aW9uPgotCi0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBBIGxpc3Qgb2YgTmFtZVRlc3RzLCBhcyBkZWZpbmVkIGluIHRoZSBYUGF0aCAyLjAgUmVjb21tZW5kYXRpb24uCi0gICAgICBFYWNoIE5hbWVUZXN0IGlzIGVpdGhlciBhIFFOYW1lLCBvciAiKiIsIG9yICJwcmVmaXg6KiIsIG9yICIqOmxvY2FsbmFtZSIKLSAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmxpc3Q+Ci0gICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICA8eHM6dW5pb24gbWVtYmVyVHlwZXM9InhzbDpRTmFtZSI+Ci0gICAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+Ci0KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iKiIvPgotICAgICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KLSAgICAgICAgICAgIDx4czpwYXR0ZXJuIHZhbHVlPSJcaVxjKjpcKiIvPgotICAgICAgICAgICAgPHhzOnBhdHRlcm4gdmFsdWU9IlwqOlxpXGMqIi8+ICAgICAgICAgICAgCi0gICAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgICAgPC94czpzaW1wbGVUeXBlPgotCi0gICAgICA8L3hzOnVuaW9uPgotICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgPC94czpsaXN0PgotPC94czpzaW1wbGVUeXBlPgotCi08eHM6c2ltcGxlVHlwZSBuYW1lPSJwcmVmaXhlcyI+Ci0gIDx4czpsaXN0IGl0ZW1UeXBlPSJ4czpOQ05hbWUiLz4KLTwveHM6c2ltcGxlVHlwZT4KLQotPHhzOnNpbXBsZVR5cGUgbmFtZT0icHJlZml4LWxpc3Qtb3ItYWxsIj4KLSAgPHhzOnVuaW9uIG1lbWJlclR5cGVzPSJ4c2w6cHJlZml4LWxpc3QiPgotICAgIDx4czpzaW1wbGVUeXBlPgotCi0gICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IiNhbGwiLz4KLSAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgPC94czpzaW1wbGVUeXBlPgotICA8L3hzOnVuaW9uPgotPC94czpzaW1wbGVUeXBlPgotICAgICAgCi08eHM6c2ltcGxlVHlwZSBuYW1lPSJwcmVmaXgtbGlzdCI+Ci0gIDx4czpsaXN0IGl0ZW1UeXBlPSJ4c2w6cHJlZml4LW9yLWRlZmF1bHQiLz4KLTwveHM6c2ltcGxlVHlwZT4KLQotPHhzOnNpbXBsZVR5cGUgbmFtZT0ibWV0aG9kIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBUaGUgbWV0aG9kIGF0dHJpYnV0ZSBvZiB4c2w6b3V0cHV0OgotICAgICAgRWl0aGVyIG9uZSBvZiB0aGUgcmVjb2duaXplZCBuYW1lcyAieG1sIiwgInhodG1sIiwgImh0bWwiLCAidGV4dCIsCi0gICAgICBvciBhIFFOYW1lIHRoYXQgbXVzdCBpbmNsdWRlIGEgcHJlZml4LgotICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6dW5pb24+Ci0gICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6TkNOYW1lIj4KLSAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ4bWwiLz4KLQotICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InhodG1sIi8+Ci0gICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iaHRtbCIvPgotICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InRleHQiLz4KLSAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgPC94czpzaW1wbGVUeXBlPgotICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzbDpRTmFtZSI+Ci0gICAgICAgIDx4czpwYXR0ZXJuIHZhbHVlPSJcYyo6XGMqIi8+Ci0gICAgICA8L3hzOnJlc3RyaWN0aW9uPgotCi0gICAgPC94czpzaW1wbGVUeXBlPgotICA8L3hzOnVuaW9uPgotPC94czpzaW1wbGVUeXBlPgotCi08eHM6c2ltcGxlVHlwZSBuYW1lPSJwYXR0ZXJuIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBBIG1hdGNoIHBhdHRlcm4gYXMgZGVmaW5lZCBpbiB0aGUgWFNMVCAyLjAgUmVjb21tZW5kYXRpb24uCi0gICAgICBUaGUgc3ludGF4IGZvciBwYXR0ZXJucyBpcyBhIHJlc3RyaWN0ZWQgZm9ybSBvZiB0aGUgc3ludGF4IGZvcgotICAgICAgWFBhdGggMi4wIGV4cHJlc3Npb25zLgotICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHNsOmV4cHJlc3Npb24iLz4KLQotPC94czpzaW1wbGVUeXBlPgotCi08eHM6c2ltcGxlVHlwZSBuYW1lPSJwcmVmaXgtb3ItZGVmYXVsdCI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgRWl0aGVyIGEgbmFtZXNwYWNlIHByZWZpeCwgb3IgI2RlZmF1bHQuCi0gICAgICBVc2VkIGluIHRoZSB4c2w6bmFtZXNwYWNlLWFsaWFzIGVsZW1lbnQuCi0gICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czp1bmlvbiBtZW1iZXJUeXBlcz0ieHM6TkNOYW1lIj4KLSAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+Ci0KLSAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIjZGVmYXVsdCIvPgotICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gIDwveHM6dW5pb24+Ci08L3hzOnNpbXBsZVR5cGU+Ci0KLTx4czpzaW1wbGVUeXBlIG5hbWU9IlFOYW1lcyI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgQSBsaXN0IG9mIFFOYW1lcy4KLSAgICAgIFVzZWQgaW4gdGhlIFt4c2w6XXVzZS1hdHRyaWJ1dGUtc2V0cyBhdHRyaWJ1dGUgb2YgdmFyaW91cyBlbGVtZW50cywKLSAgICAgIGFuZCBpbiB0aGUgY2RhdGEtc2VjdGlvbi1lbGVtZW50cyBhdHRyaWJ1dGUgb2YgeHNsOm91dHB1dAotICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLQotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpsaXN0IGl0ZW1UeXBlPSJ4c2w6UU5hbWUiLz4gICAgICAgICAgCi08L3hzOnNpbXBsZVR5cGU+Ci0KLTx4czpzaW1wbGVUeXBlIG5hbWU9IlFOYW1lIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBBIFFOYW1lLgotICAgICAgVGhpcyBzY2hlbWEgZG9lcyBub3QgdXNlIHRoZSBidWlsdC1pbiB0eXBlIHhzOlFOYW1lLCBidXQgcmF0aGVyIGRlZmluZXMgaXRzIG93bgotICAgICAgUU5hbWUgdHlwZS4gQWx0aG91Z2ggeHM6UU5hbWUgd291bGQgZGVmaW5lIHRoZSBjb3JyZWN0IHZhbGlkYXRpb24gb24gdGhlc2UgYXR0cmlidXRlcywKLSAgICAgIGEgc2NoZW1hIHByb2Nlc3NvciB3b3VsZCBleHBhbmQgdW5wcmVmaXhlZCBRTmFtZXMgaW5jb3JyZWN0bHkgd2hlbiBjb25zdHJ1Y3RpbmcgdGhlIFBTVkksCi0gICAgICBiZWNhdXNlIChhcyBkZWZpbmVkIGluIFhNTCBTY2hlbWEgZXJyYXRhKSBhbiB1bnByZWZpeGVkIHhzOlFOYW1lIGlzIGFzc3VtZWQgdG8gYmUgaW4KLSAgICAgIHRoZSBkZWZhdWx0IG5hbWVzcGFjZSwgd2hpY2ggaXMgbm90IHRoZSBjb3JyZWN0IGFzc3VtcHRpb24gZm9yIFhTTFQuCi0gICAgICBUaGUgZGF0YSB0eXBlIGlzIGRlZmluZWQgYXMgYSByZXN0cmljdGlvbiBvZiB0aGUgYnVpbHQtaW4gdHlwZSBOYW1lLCByZXN0cmljdGVkCi0gICAgICBzbyB0aGF0IGl0IGNhbiBvbmx5IGNvbnRhaW4gb25lIGNvbG9uIHdoaWNoIG11c3Qgbm90IGJlIHRoZSBmaXJzdCBvciBsYXN0IGNoYXJhY3Rlci4KLSAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5hbWUiPgotCi0gICAgPHhzOnBhdHRlcm4gdmFsdWU9IihbXjpdKzopP1teOl0rIi8+ICAgICAgCi0gIDwveHM6cmVzdHJpY3Rpb24+ICAgICAgICAKLTwveHM6c2ltcGxlVHlwZT4KLQotPHhzOnNpbXBsZVR5cGUgbmFtZT0ic2VxdWVuY2UtdHlwZSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgVGhlIGRlc2NyaXB0aW9uIG9mIGEgZGF0YSB0eXBlLCBjb25mb3JtaW5nIHRvIHRoZQotICAgICAgU2VxdWVuY2VUeXBlIHByb2R1Y3Rpb24gZGVmaW5lZCBpbiB0aGUgWFBhdGggMi4wIFJlY29tbWVuZGF0aW9uCi0gICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+Ci0KLSAgICA8eHM6cGF0dGVybiB2YWx1ZT0iLisiLz4gICAgICAKLSAgPC94czpyZXN0cmljdGlvbj4KLTwveHM6c2ltcGxlVHlwZT4KLQotPHhzOnNpbXBsZVR5cGUgbmFtZT0idXJpLWxpc3QiPgotICA8eHM6bGlzdCBpdGVtVHlwZT0ieHM6YW55VVJJIi8+Ci08L3hzOnNpbXBsZVR5cGU+Ci0KLTx4czpzaW1wbGVUeXBlIG5hbWU9InZhbGlkYXRpb24tc3RyaXAtb3ItcHJlc2VydmUiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIERlc2NyaWJlcyBkaWZmZXJlbnQgd2F5cyBvZiB0eXBlLWFubm90YXRpbmcgYW4gZWxlbWVudCBvciBhdHRyaWJ1dGUuCi0gICAgPC94czpkb2N1bWVudGF0aW9uPgotCi0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzbDp2YWxpZGF0aW9uLXR5cGUiPgotICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0icHJlc2VydmUiLz4KLSAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InN0cmlwIi8+ICAgIAotICA8L3hzOnJlc3RyaWN0aW9uPgotPC94czpzaW1wbGVUeXBlPgotCi08eHM6c2ltcGxlVHlwZSBuYW1lPSJ2YWxpZGF0aW9uLXR5cGUiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIERlc2NyaWJlcyBkaWZmZXJlbnQgd2F5cyBvZiB0eXBlLWFubm90YXRpbmcgYW4gZWxlbWVudCBvciBhdHRyaWJ1dGUuCi0gICAgPC94czpkb2N1bWVudGF0aW9uPgotCi0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KLSAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InN0cmljdCIvPgotICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibGF4Ii8+Ci0gICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJwcmVzZXJ2ZSIvPgotICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ic3RyaXAiLz4gICAgCi0gIDwveHM6cmVzdHJpY3Rpb24+Ci08L3hzOnNpbXBsZVR5cGU+Ci0KLTx4czpzaW1wbGVUeXBlIG5hbWU9Inllcy1vci1ubyI+Ci0gIDx4czphbm5vdGF0aW9uPgotCi0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBPbmUgb2YgdGhlIHZhbHVlcyAieWVzIiBvciAibm8iLgotICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ieWVzIi8+Ci0gICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJubyIvPgotICA8L3hzOnJlc3RyaWN0aW9uPgotPC94czpzaW1wbGVUeXBlPgotCi08eHM6c2ltcGxlVHlwZSBuYW1lPSJ5ZXMtb3Itbm8tb3Itb21pdCI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgT25lIG9mIHRoZSB2YWx1ZXMgInllcyIgb3IgIm5vIiBvciAib21pdCIuCi0gICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+Ci0gICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ5ZXMiLz4KLSAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im5vIi8+Ci0gICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJvbWl0Ii8+Ci0KLSAgPC94czpyZXN0cmljdGlvbj4KLTwveHM6c2ltcGxlVHlwZT4KLQotPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS94c2x0LXNjaGVtYXMveHNsdC0yLjAueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUveHNsdC1zY2hlbWFzL3hzbHQtMi4wLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU3NTJlYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS94c2x0LXNjaGVtYXMveHNsdC0yLjAueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTExOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTx4czpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIj4KLQotPCEtLSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KLTx4czphbm5vdGF0aW9uPgotICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgCi0gICAgVGhpcyBpcyBhIHNjaGVtYSBmb3IgWFNMVCAyLjAgc3R5bGVzaGVldHMuCi0gICAgCi0gICAgSXQgZGVmaW5lcyBhbGwgdGhlIGVsZW1lbnRzIHRoYXQgYXBwZWFyIGluIHRoZSBYU0xUIG5hbWVzcGFjZTsgaXQgYWxzbwotICAgIHByb3ZpZGVzIGhvb2tzIHRoYXQgYWxsb3cgdGhlIGluY2x1c2lvbiBvZiB1c2VyLWRlZmluZWQgbGl0ZXJhbCByZXN1bHQgZWxlbWVudHMsCi0gICAgZXh0ZW5zaW9uIGluc3RydWN0aW9ucywgYW5kIHRvcC1sZXZlbCBkYXRhIGVsZW1lbnRzLgotICAgIAotICAgIFRoZSBzY2hlbWEgaXMgZGVyaXZlZCAod2l0aCBraW5kIHBlcm1pc3Npb24pIGZyb20gYSBzY2hlbWEgZm9yIFhTTFQgMS4wIHN0eWxlc2hlZXRzCi0gICAgcHJvZHVjZWQgYnkgQXNpciBTIFZlZGFtdXRodSBvZiBXZWJNZXRob2RzIEluYy4KLSAgICAKLSAgICBUaGlzIHNjaGVtYSBpcyBhdmFpbGFibGUgZm9yIHVzZSB1bmRlciB0aGUgY29uZGl0aW9ucyBvZiB0aGUgVzNDIFNvZnR3YXJlIExpY2Vuc2UKLSAgICBwdWJsaXNoZWQgYXQgaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC9jb3B5cmlnaHQtc29mdHdhcmUtMTk5ODA3MjAKLSAgICAKLSAgICBUaGUgc2NoZW1hIGlzIG9yZ2FuaXplZCBhcyBmb2xsb3dzOgotICAgIAotICAgIFBBUlQgQTogZGVmaW5pdGlvbnMgb2YgY29tcGxleCB0eXBlcyBhbmQgbW9kZWwgZ3JvdXBzIHVzZWQgYXMgdGhlIGJhc2lzIAotICAgICAgICAgICAgZm9yIGVsZW1lbnQgZGVmaW5pdGlvbnMKLSAgICBQQVJUIEI6IGRlZmluaXRpb25zIG9mIGluZGl2aWR1YWwgWFNMVCBlbGVtZW50cwotICAgIFBBUlQgQzogZGVmaW5pdGlvbnMgZm9yIGxpdGVyYWwgcmVzdWx0IGVsZW1lbnRzCi0gICAgUEFSVCBEOiBkZWZpbml0aW9ucyBvZiBzaW1wbGUgdHlwZXMgdXNlZCBpbiBhdHRyaWJ1dGUgZGVmaW5pdGlvbnMKLSAgICAKLSAgICBUaGlzIHNjaGVtYSBkb2VzIG5vdCBhdHRlbXB0IHRvIGRlZmluZSBhbGwgdGhlIGNvbnN0cmFpbnRzIHRoYXQgYXBwbHkgdG8gYSB2YWxpZAotICAgIFhTTFQgMi4wIHN0eWxlc2hlZXQgbW9kdWxlLiBJdCBpcyB0aGUgaW50ZW50aW9uIHRoYXQgYWxsIHZhbGlkIHN0eWxlc2hlZXQgbW9kdWxlcyAKLSAgICBzaG91bGQgY29uZm9ybSB0byB0aGlzIHNjaGVtYTsgaG93ZXZlciwgdGhlIHNjaGVtYSBpcyBub24tbm9ybWF0aXZlIGFuZCBpbiB0aGUgZXZlbnQgCi0gICAgb2YgYW55IGNvbmZsaWN0LCB0aGUgdGV4dCBvZiB0aGUgUmVjb21tZW5kYXRpb24gdGFrZXMgcHJlY2VkZW5jZS4KLQotICAgIFRoaXMgc2NoZW1hIGRvZXMgbm90IGltcGxlbWVudCB0aGUgc3BlY2lhbCBydWxlcyB0aGF0IGFwcGx5IHdoZW4gYSBzdHlsZXNoZWV0Ci0gICAgaGFzIHNlY3Rpb25zIHRoYXQgdXNlIGZvcndhcmRzLWNvbXBhdGlibGUtbW9kZS4gSW4gdGhpcyBtb2RlLCBzZXR0aW5nIHZlcnNpb249IjMuMCIKLSAgICBhbGxvd3MgZWxlbWVudHMgZnJvbSB0aGUgWFNMVCBuYW1lc3BhY2UgdG8gYmUgdXNlZCB0aGF0IGFyZSBub3QgZGVmaW5lZCBpbiBYU0xUIDIuMC4KLQotICAgIFNpbXBsaWZpZWQgc3R5bGVzaGVldHMgKHRob3NlIHdpdGggYSBsaXRlcmFsIHJlc3VsdCBlbGVtZW50IGFzIHRoZSBvdXRlcm1vc3QgZWxlbWVudCkKLSAgICB3aWxsIHZhbGlkYXRlIGFnYWluc3QgdGhpcyBzY2hlbWEgb25seSBpZiB2YWxpZGF0aW9uIHN0YXJ0cyBpbiBsYXggbW9kZS4KLSAgICAKLSAgICBUaGlzIHZlcnNpb24gaXMgZGF0ZWQgMjAwNS0wMi0xMQotICAgIEF1dGhvcnM6IE1pY2hhZWwgSCBLYXksIFNheG9uaWNhIExpbWl0ZWQKLSAgICAgICAgICAgICBKZW5pIFRlbm5pc29uLCBKZW5pIFRlbm5pc29uIENvbnN1bHRpbmcgTHRkLgotICAgIAotICA8L3hzOmRvY3VtZW50YXRpb24+Ci08L3hzOmFubm90YXRpb24+ICAgCi08IS0tICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgotIAotPCEtLQotVGhlIGRlY2xhcmF0aW9uIG9mIHhtbDpzcGFjZSBhbmQgeG1sOmxhbmcgbWF5IG5lZWQgdG8gYmUgY29tbWVudGVkIG91dCBiZWNhdXNlCi1vZiBwcm9ibGVtcyBwcm9jZXNzaW5nIHRoZSBzY2hlbWEgdXNpbmcgdmFyaW91cyB0b29scwotLS0+Ci0gICAgICAKLTx4czppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiIAotICBzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIi8+Ci0KLTwhLS0gCi0gICAgQW4gWFNMVCBzdHlsZXNoZWV0IG1heSBjb250YWluIGFuIGluLWxpbmUgc2NoZW1hIHdpdGhpbiBhbiB4c2w6aW1wb3J0LXNjaGVtYSBlbGVtZW50LAotICAgIHNvIHRoZSBTY2hlbWEgZm9yIHNjaGVtYXMgbmVlZHMgdG8gYmUgaW1wb3J0ZWQKLS0tPgotICAKLTx4czppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICAgICAgICAgIHNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS54c2QiLz4KLQotPCEtLSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KLTx4czphbm5vdGF0aW9uPgotICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICBQQVJUIEE6IGRlZmluaXRpb25zIG9mIGNvbXBsZXggdHlwZXMgYW5kIG1vZGVsIGdyb3VwcyB1c2VkIGFzIHRoZSBiYXNpcyAKLSAgICAgICAgICAgIGZvciBlbGVtZW50IGRlZmluaXRpb25zCi0gIDwveHM6ZG9jdW1lbnRhdGlvbj4KLTwveHM6YW5ub3RhdGlvbj4gICAKLTwhLS0gKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+Ci0KLTx4czpjb21wbGV4VHlwZSBuYW1lPSJnZW5lcmljLWVsZW1lbnQtdHlwZSIgbWl4ZWQ9InRydWUiPgotICA8eHM6YXR0cmlidXRlIG5hbWU9ImRlZmF1bHQtY29sbGF0aW9uIiB0eXBlPSJ4c2w6dXJpLWxpc3QiLz4KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJleGNsdWRlLXJlc3VsdC1wcmVmaXhlcyIgdHlwZT0ieHNsOnByZWZpeC1saXN0LW9yLWFsbCIvPgotICA8eHM6YXR0cmlidXRlIG5hbWU9ImV4dGVuc2lvbi1lbGVtZW50LXByZWZpeGVzIiB0eXBlPSJ4c2w6cHJlZml4LWxpc3QiLz4KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ1c2Utd2hlbiIgdHlwZT0ieHNsOmV4cHJlc3Npb24iLz4KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4cGF0aC1kZWZhdWx0LW5hbWVzcGFjZSIgdHlwZT0ieHM6YW55VVJJIi8+Ci0gIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotPC94czpjb21wbGV4VHlwZT4KLQotPHhzOmNvbXBsZXhUeXBlIG5hbWU9InZlcnNpb25lZC1lbGVtZW50LXR5cGUiIG1peGVkPSJ0cnVlIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOmdlbmVyaWMtZWxlbWVudC10eXBlIj4gICAgCi0gICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InhzOmRlY2ltYWwiIHVzZT0ib3B0aW9uYWwiLz4KLSAgICA8L3hzOmV4dGVuc2lvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLTwveHM6Y29tcGxleFR5cGU+Ci0KLTx4czpjb21wbGV4VHlwZSBuYW1lPSJlbGVtZW50LW9ubHktdmVyc2lvbmVkLWVsZW1lbnQtdHlwZSIgbWl4ZWQ9ImZhbHNlIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4c2w6dmVyc2lvbmVkLWVsZW1lbnQtdHlwZSI+Ci0gICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotPC94czpjb21wbGV4VHlwZT4KLQotPHhzOmNvbXBsZXhUeXBlIG5hbWU9InNlcXVlbmNlLWNvbnN0cnVjdG9yIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50IG1peGVkPSJ0cnVlIj4KLSAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDp2ZXJzaW9uZWQtZWxlbWVudC10eXBlIj4gICAgCi0gICAgICA8eHM6Z3JvdXAgcmVmPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3ItZ3JvdXAiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzOmV4dGVuc2lvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLTwveHM6Y29tcGxleFR5cGU+Ci0KLTx4czpncm91cCBuYW1lPSJzZXF1ZW5jZS1jb25zdHJ1Y3Rvci1ncm91cCI+Ci0gIDx4czpjaG9pY2U+Ci0gICAgPHhzOmVsZW1lbnQgcmVmPSJ4c2w6dmFyaWFibGUiLz4KLSAgICA8eHM6ZWxlbWVudCByZWY9InhzbDppbnN0cnVjdGlvbiIvPgotICAgIDx4czpncm91cCByZWY9InhzbDpyZXN1bHQtZWxlbWVudHMiLz4KLSAgPC94czpjaG9pY2U+Ci08L3hzOmdyb3VwPgotCi08eHM6ZWxlbWVudCBuYW1lPSJkZWNsYXJhdGlvbiIgdHlwZT0ieHNsOmdlbmVyaWMtZWxlbWVudC10eXBlIiBhYnN0cmFjdD0idHJ1ZSIvPgotCi08eHM6ZWxlbWVudCBuYW1lPSJpbnN0cnVjdGlvbiIgdHlwZT0ieHNsOnZlcnNpb25lZC1lbGVtZW50LXR5cGUiIGFic3RyYWN0PSJ0cnVlIi8+Ci0KLTwhLS0gKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+Ci08eHM6YW5ub3RhdGlvbj4KLSAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgUEFSVCBCOiBkZWZpbml0aW9ucyBvZiBpbmRpdmlkdWFsIFhTTFQgZWxlbWVudHMgICAgCi0gICAgRWxlbWVudHMgYXJlIGxpc3RlZCBpbiBhbHBoYWJldGljYWwgb3JkZXIuICAgIAotICA8L3hzOmRvY3VtZW50YXRpb24+Ci08L3hzOmFubm90YXRpb24+ICAgCi08IS0tICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgotCi08eHM6ZWxlbWVudCBuYW1lPSJhbmFseXplLXN0cmluZyIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDppbnN0cnVjdGlvbiI+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDplbGVtZW50LW9ubHktdmVyc2lvbmVkLWVsZW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzbDptYXRjaGluZy1zdWJzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieHNsOm5vbi1tYXRjaGluZy1zdWJzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieHNsOmZhbGxiYWNrIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2VsZWN0IiB0eXBlPSJ4c2w6ZXhwcmVzc2lvbiIgdXNlPSJyZXF1aXJlZCIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlZ2V4IiB0eXBlPSJ4c2w6YXZ0IiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZmxhZ3MiIHR5cGU9InhzbDphdnQiIGRlZmF1bHQ9IiIvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0iYXBwbHktaW1wb3J0cyIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDppbnN0cnVjdGlvbiI+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDplbGVtZW50LW9ubHktdmVyc2lvbmVkLWVsZW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzbDp3aXRoLXBhcmFtIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJhcHBseS10ZW1wbGF0ZXMiIHN1YnN0aXR1dGlvbkdyb3VwPSJ4c2w6aW5zdHJ1Y3Rpb24iPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6ZWxlbWVudC1vbmx5LXZlcnNpb25lZC1lbGVtZW50LXR5cGUiPgotICAgICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieHNsOnNvcnQiLz4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzbDp3aXRoLXBhcmFtIi8+Ci0gICAgICAgIDwveHM6Y2hvaWNlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNlbGVjdCIgdHlwZT0ieHNsOmV4cHJlc3Npb24iIGRlZmF1bHQ9ImNoaWxkOjpub2RlKCkiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtb2RlIiB0eXBlPSJ4c2w6bW9kZSIvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmluc3RydWN0aW9uIj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0idHJ1ZSI+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3RvciI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNsOmF2dCIgdXNlPSJyZXF1aXJlZCIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHNsOmF2dCIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNlbGVjdCIgdHlwZT0ieHNsOmV4cHJlc3Npb24iLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzZXBhcmF0b3IiIHR5cGU9InhzbDphdnQiLz4gICAKLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4c2w6UU5hbWUiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2YWxpZGF0aW9uIiB0eXBlPSJ4c2w6dmFsaWRhdGlvbi10eXBlIi8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PiAgICAgICAgCi0KLTx4czplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1zZXQiIHN1YnN0aXR1dGlvbkdyb3VwPSJ4c2w6ZGVjbGFyYXRpb24iPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6ZWxlbWVudC1vbmx5LXZlcnNpb25lZC1lbGVtZW50LXR5cGUiPgotICAgICAgICA8eHM6c2VxdWVuY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4c2w6YXR0cmlidXRlIi8+Ci0gICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNsOlFOYW1lIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idXNlLWF0dHJpYnV0ZS1zZXRzIiB0eXBlPSJ4c2w6UU5hbWVzIiBkZWZhdWx0PSIiLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9ImNhbGwtdGVtcGxhdGUiIHN1YnN0aXR1dGlvbkdyb3VwPSJ4c2w6aW5zdHJ1Y3Rpb24iPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6ZWxlbWVudC1vbmx5LXZlcnNpb25lZC1lbGVtZW50LXR5cGUiPgotICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4c2w6d2l0aC1wYXJhbSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzbDpRTmFtZSIgdXNlPSJyZXF1aXJlZCIvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0iY2hhcmFjdGVyLW1hcCIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDpkZWNsYXJhdGlvbiI+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDplbGVtZW50LW9ubHktdmVyc2lvbmVkLWVsZW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzbDpvdXRwdXQtY2hhcmFjdGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNsOlFOYW1lIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idXNlLWNoYXJhY3Rlci1tYXBzIiB0eXBlPSJ4c2w6UU5hbWVzIiBkZWZhdWx0PSIiLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9ImNob29zZSIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDppbnN0cnVjdGlvbiI+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDplbGVtZW50LW9ubHktdmVyc2lvbmVkLWVsZW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzbDp3aGVuIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieHNsOm90aGVyd2lzZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJjb21tZW50IiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmluc3RydWN0aW9uIj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0idHJ1ZSI+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3RvciI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2VsZWN0IiB0eXBlPSJ4c2w6ZXhwcmVzc2lvbiIvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0iY29weSIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDppbnN0cnVjdGlvbiI+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3IiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNvcHktbmFtZXNwYWNlcyIgdHlwZT0ieHNsOnllcy1vci1ubyIgZGVmYXVsdD0ieWVzIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaW5oZXJpdC1uYW1lc3BhY2VzIiB0eXBlPSJ4c2w6eWVzLW9yLW5vIiBkZWZhdWx0PSJ5ZXMiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ1c2UtYXR0cmlidXRlLXNldHMiIHR5cGU9InhzbDpRTmFtZXMiIGRlZmF1bHQ9IiIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzbDpRTmFtZSIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZhbGlkYXRpb24iIHR5cGU9InhzbDp2YWxpZGF0aW9uLXR5cGUiLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9ImNvcHktb2YiIHN1YnN0aXR1dGlvbkdyb3VwPSJ4c2w6aW5zdHJ1Y3Rpb24iPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50IG1peGVkPSJ0cnVlIj4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOnZlcnNpb25lZC1lbGVtZW50LXR5cGUiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNlbGVjdCIgdHlwZT0ieHNsOmV4cHJlc3Npb24iIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjb3B5LW5hbWVzcGFjZXMiIHR5cGU9InhzbDp5ZXMtb3Itbm8iIGRlZmF1bHQ9InllcyIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzbDpRTmFtZSIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZhbGlkYXRpb24iIHR5cGU9InhzbDp2YWxpZGF0aW9uLXR5cGUiLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9ImRlY2ltYWwtZm9ybWF0IiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmRlY2xhcmF0aW9uIj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOmVsZW1lbnQtb25seS12ZXJzaW9uZWQtZWxlbWVudC10eXBlIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2w6UU5hbWUiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkZWNpbWFsLXNlcGFyYXRvciIgdHlwZT0ieHNsOmNoYXIiIGRlZmF1bHQ9Ii4iLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJncm91cGluZy1zZXBhcmF0b3IiIHR5cGU9InhzbDpjaGFyIiBkZWZhdWx0PSIsIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaW5maW5pdHkiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iSW5maW5pdHkiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtaW51cy1zaWduIiB0eXBlPSJ4c2w6Y2hhciIgZGVmYXVsdD0iLSIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Ik5hTiIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSJOYU4iLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJwZXJjZW50IiB0eXBlPSJ4c2w6Y2hhciIgZGVmYXVsdD0iJSIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InBlci1taWxsZSIgdHlwZT0ieHNsOmNoYXIiIGRlZmF1bHQ9IiYjeDIwMzA7Ii8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iemVyby1kaWdpdCIgdHlwZT0ieHNsOmNoYXIiIGRlZmF1bHQ9IjAiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkaWdpdCIgdHlwZT0ieHNsOmNoYXIiIGRlZmF1bHQ9IiMiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJwYXR0ZXJuLXNlcGFyYXRvciIgdHlwZT0ieHNsOmNoYXIiIGRlZmF1bHQ9IjsiLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9ImVsZW1lbnQiIHN1YnN0aXR1dGlvbkdyb3VwPSJ4c2w6aW5zdHJ1Y3Rpb24iPgotICA8eHM6Y29tcGxleFR5cGUgbWl4ZWQ9InRydWUiPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOnNlcXVlbmNlLWNvbnN0cnVjdG9yIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2w6YXZ0IiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJ4c2w6YXZ0Ii8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaW5oZXJpdC1uYW1lc3BhY2VzIiB0eXBlPSJ4c2w6eWVzLW9yLW5vIiBkZWZhdWx0PSJ5ZXMiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ1c2UtYXR0cmlidXRlLXNldHMiIHR5cGU9InhzbDpRTmFtZXMiIGRlZmF1bHQ9IiIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzbDpRTmFtZSIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZhbGlkYXRpb24iIHR5cGU9InhzbDp2YWxpZGF0aW9uLXR5cGUiLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9ImZhbGxiYWNrIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmluc3RydWN0aW9uIiB0eXBlPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3IiLz4KLQotPHhzOmVsZW1lbnQgbmFtZT0iZm9yLWVhY2giIHN1YnN0aXR1dGlvbkdyb3VwPSJ4c2w6aW5zdHJ1Y3Rpb24iPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50IG1peGVkPSJ0cnVlIj4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOnZlcnNpb25lZC1lbGVtZW50LXR5cGUiPgotICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4c2w6c29ydCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgIDx4czpncm91cCByZWY9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3Rvci1ncm91cCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNlbGVjdCIgdHlwZT0ieHNsOmV4cHJlc3Npb24iIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9ImZvci1lYWNoLWdyb3VwIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmluc3RydWN0aW9uIj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0idHJ1ZSI+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDp2ZXJzaW9uZWQtZWxlbWVudC10eXBlIj4KLSAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieHNsOnNvcnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICA8eHM6Z3JvdXAgcmVmPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3ItZ3JvdXAiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzZWxlY3QiIHR5cGU9InhzbDpleHByZXNzaW9uIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZ3JvdXAtYnkiIHR5cGU9InhzbDpleHByZXNzaW9uIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZ3JvdXAtYWRqYWNlbnQiIHR5cGU9InhzbDpleHByZXNzaW9uIi8+ICAgICAgICAgICAgCi0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZ3JvdXAtc3RhcnRpbmctd2l0aCIgdHlwZT0ieHNsOnBhdHRlcm4iLz4gICAgICAgICAgICAKLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJncm91cC1lbmRpbmctd2l0aCIgdHlwZT0ieHNsOnBhdHRlcm4iLz4gICAgICAgICAgICAKLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjb2xsYXRpb24iIHR5cGU9InhzOmFueVVSSSIvPiAgICAgICAgICAgIAotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0iZnVuY3Rpb24iIHN1YnN0aXR1dGlvbkdyb3VwPSJ4c2w6ZGVjbGFyYXRpb24iPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50IG1peGVkPSJ0cnVlIj4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOnZlcnNpb25lZC1lbGVtZW50LXR5cGUiPgotICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4c2w6cGFyYW0iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICA8eHM6Z3JvdXAgcmVmPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3ItZ3JvdXAiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2w6UU5hbWUiIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJvdmVycmlkZSIgdHlwZT0ieHNsOnllcy1vci1ubyIgZGVmYXVsdD0ieWVzIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYXMiIHR5cGU9InhzbDpzZXF1ZW5jZS10eXBlIiBkZWZhdWx0PSJpdGVtKCkqIi8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJpZiIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDppbnN0cnVjdGlvbiI+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3IiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InRlc3QiIHR5cGU9InhzbDpleHByZXNzaW9uIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJpbXBvcnQiPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6ZWxlbWVudC1vbmx5LXZlcnNpb25lZC1lbGVtZW50LXR5cGUiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImhyZWYiIHR5cGU9InhzOmFueVVSSSIgdXNlPSJyZXF1aXJlZCIvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0iaW1wb3J0LXNjaGVtYSIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDpkZWNsYXJhdGlvbiI+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDplbGVtZW50LW9ubHktdmVyc2lvbmVkLWVsZW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzOnNjaGVtYSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InhzOmFueVVSSSIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNjaGVtYS1sb2NhdGlvbiIgdHlwZT0ieHM6YW55VVJJIi8+ICAgICAgICAgICAgICAgICAgCi0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmRlY2xhcmF0aW9uIj4KLSAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOmVsZW1lbnQtb25seS12ZXJzaW9uZWQtZWxlbWVudC10eXBlIj4KLSAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImhyZWYiIHR5cGU9InhzOmFueVVSSSIgdXNlPSJyZXF1aXJlZCIvPgotICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9ImtleSIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDpkZWNsYXJhdGlvbiI+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3IiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzbDpRTmFtZSIgdXNlPSJyZXF1aXJlZCIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1hdGNoIiB0eXBlPSJ4c2w6cGF0dGVybiIgdXNlPSJyZXF1aXJlZCIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InVzZSIgdHlwZT0ieHNsOmV4cHJlc3Npb24iLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjb2xsYXRpb24iIHR5cGU9InhzOmFueVVSSSIvPiAgICAgICAgICAgICAgIAotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0ibWF0Y2hpbmctc3Vic3RyaW5nIiB0eXBlPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3IiLz4KLQotPHhzOmVsZW1lbnQgbmFtZT0ibWVzc2FnZSIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDppbnN0cnVjdGlvbiI+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3IiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNlbGVjdCIgdHlwZT0ieHNsOmV4cHJlc3Npb24iLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0ZXJtaW5hdGUiIHR5cGU9InhzbDphdnQiIGRlZmF1bHQ9Im5vIi8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJuYW1lc3BhY2UiIHN1YnN0aXR1dGlvbkdyb3VwPSJ4c2w6aW5zdHJ1Y3Rpb24iPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50IG1peGVkPSJ0cnVlIj4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOnNlcXVlbmNlLWNvbnN0cnVjdG9yIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2w6YXZ0IiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2VsZWN0IiB0eXBlPSJ4c2w6ZXhwcmVzc2lvbiIvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0ibmFtZXNwYWNlLWFsaWFzIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmRlY2xhcmF0aW9uIj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOmVsZW1lbnQtb25seS12ZXJzaW9uZWQtZWxlbWVudC10eXBlIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzdHlsZXNoZWV0LXByZWZpeCIgdHlwZT0ieHNsOnByZWZpeC1vci1kZWZhdWx0IiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVzdWx0LXByZWZpeCIgdHlwZT0ieHNsOnByZWZpeC1vci1kZWZhdWx0IiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJuZXh0LW1hdGNoIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmluc3RydWN0aW9uIj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOmVsZW1lbnQtb25seS12ZXJzaW9uZWQtZWxlbWVudC10eXBlIj4KLSAgICAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzbDp3aXRoLXBhcmFtIi8+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4c2w6ZmFsbGJhY2siLz4KLSAgICAgICAgPC94czpjaG9pY2U+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJub24tbWF0Y2hpbmctc3Vic3RyaW5nIiB0eXBlPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3IiLz4KLQotPHhzOmVsZW1lbnQgbmFtZT0ibnVtYmVyIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmluc3RydWN0aW9uIj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0idHJ1ZSI+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDp2ZXJzaW9uZWQtZWxlbWVudC10eXBlIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNsOmV4cHJlc3Npb24iLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzZWxlY3QiIHR5cGU9InhzbDpleHByZXNzaW9uIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibGV2ZWwiIHR5cGU9InhzbDpsZXZlbCIgZGVmYXVsdD0ic2luZ2xlIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY291bnQiIHR5cGU9InhzbDpwYXR0ZXJuIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZnJvbSIgdHlwZT0ieHNsOnBhdHRlcm4iLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmb3JtYXQiIHR5cGU9InhzbDphdnQiIGRlZmF1bHQ9IjEiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIiB0eXBlPSJ4c2w6YXZ0Ii8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibGV0dGVyLXZhbHVlIiB0eXBlPSJ4c2w6YXZ0Ii8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ib3JkaW5hbCIgdHlwZT0ieHNsOmF2dCIvPiAgICAgICAgCi0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZ3JvdXBpbmctc2VwYXJhdG9yIiB0eXBlPSJ4c2w6YXZ0Ii8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZ3JvdXBpbmctc2l6ZSIgdHlwZT0ieHNsOmF2dCIvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0ib3RoZXJ3aXNlIiB0eXBlPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3IiLz4KLQotPHhzOmVsZW1lbnQgbmFtZT0ib3V0cHV0IiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmRlY2xhcmF0aW9uIj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0idHJ1ZSI+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDpnZW5lcmljLWVsZW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNsOlFOYW1lIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kIiB0eXBlPSJ4c2w6bWV0aG9kIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYnl0ZS1vcmRlci1tYXJrIiB0eXBlPSJ4c2w6eWVzLW9yLW5vIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY2RhdGEtc2VjdGlvbi1lbGVtZW50cyIgdHlwZT0ieHNsOlFOYW1lcyIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImRvY3R5cGUtcHVibGljIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkb2N0eXBlLXN5c3RlbSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZW5jb2RpbmciIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImVzY2FwZS11cmktYXR0cmlidXRlcyIgdHlwZT0ieHNsOnllcy1vci1ubyIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImluY2x1ZGUtY29udGVudC10eXBlIiB0eXBlPSJ4c2w6eWVzLW9yLW5vIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaW5kZW50IiB0eXBlPSJ4c2w6eWVzLW9yLW5vIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWVkaWEtdHlwZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibm9ybWFsaXphdGlvbi1mb3JtIiB0eXBlPSJ4czpOTVRPS0VOIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ib21pdC14bWwtZGVjbGFyYXRpb24iIHR5cGU9InhzbDp5ZXMtb3Itbm8iLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzdGFuZGFsb25lIiB0eXBlPSJ4c2w6eWVzLW9yLW5vLW9yLW9taXQiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ1bmRlY2xhcmUtcHJlZml4ZXMiIHR5cGU9InhzbDp5ZXMtb3Itbm8iLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ1c2UtY2hhcmFjdGVyLW1hcHMiIHR5cGU9InhzbDpRTmFtZXMiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJ4czpOTVRPS0VOIi8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJvdXRwdXQtY2hhcmFjdGVyIj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOmVsZW1lbnQtb25seS12ZXJzaW9uZWQtZWxlbWVudC10eXBlIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjaGFyYWN0ZXIiIHR5cGU9InhzbDpjaGFyIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic3RyaW5nIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9InBhcmFtIj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0idHJ1ZSI+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3RvciI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNsOlFOYW1lIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2VsZWN0IiB0eXBlPSJ4c2w6ZXhwcmVzc2lvbiIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImFzIiB0eXBlPSJ4c2w6c2VxdWVuY2UtdHlwZSIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlcXVpcmVkIiB0eXBlPSJ4c2w6eWVzLW9yLW5vIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHVubmVsIiB0eXBlPSJ4c2w6eWVzLW9yLW5vIi8+ICAgICAgICAKLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9InBlcmZvcm0tc29ydCIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDppbnN0cnVjdGlvbiI+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6dmVyc2lvbmVkLWVsZW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzbDpzb3J0IiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgPHhzOmdyb3VwIHJlZj0ieHNsOnNlcXVlbmNlLWNvbnN0cnVjdG9yLWdyb3VwIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2VsZWN0IiB0eXBlPSJ4c2w6ZXhwcmVzc2lvbiIvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0icHJlc2VydmUtc3BhY2UiIHN1YnN0aXR1dGlvbkdyb3VwPSJ4c2w6ZGVjbGFyYXRpb24iPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6ZWxlbWVudC1vbmx5LXZlcnNpb25lZC1lbGVtZW50LXR5cGUiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImVsZW1lbnRzIiB0eXBlPSJ4c2w6bmFtZXRlc3RzIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJwcm9jZXNzaW5nLWluc3RydWN0aW9uIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmluc3RydWN0aW9uIj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0idHJ1ZSI+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3RvciI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNsOmF2dCIgdXNlPSJyZXF1aXJlZCIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNlbGVjdCIgdHlwZT0ieHNsOmV4cHJlc3Npb24iLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9InJlc3VsdC1kb2N1bWVudCIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDppbnN0cnVjdGlvbiI+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3IiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZvcm1hdCIgdHlwZT0ieHNsOlFOYW1lIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaHJlZiIgdHlwZT0ieHNsOmF2dCIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzbDpRTmFtZSIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZhbGlkYXRpb24iIHR5cGU9InhzbDp2YWxpZGF0aW9uLXR5cGUiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QiIHR5cGU9InhzbDphdnQiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJieXRlLW9yZGVyLW1hcmsiIHR5cGU9InhzbDphdnQiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjZGF0YS1zZWN0aW9uLWVsZW1lbnRzIiB0eXBlPSJ4c2w6YXZ0Ii8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZG9jdHlwZS1wdWJsaWMiIHR5cGU9InhzbDphdnQiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkb2N0eXBlLXN5c3RlbSIgdHlwZT0ieHNsOmF2dCIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImVuY29kaW5nIiB0eXBlPSJ4c2w6YXZ0Ii8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZXNjYXBlLXVyaS1hdHRyaWJ1dGVzIiB0eXBlPSJ4c2w6YXZ0Ii8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaW5jbHVkZS1jb250ZW50LXR5cGUiIHR5cGU9InhzbDphdnQiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJpbmRlbnQiIHR5cGU9InhzbDphdnQiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtZWRpYS10eXBlIiB0eXBlPSJ4c2w6YXZ0Ii8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibm9ybWFsaXphdGlvbi1mb3JtIiB0eXBlPSJ4c2w6YXZ0Ii8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ib21pdC14bWwtZGVjbGFyYXRpb24iIHR5cGU9InhzbDphdnQiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzdGFuZGFsb25lIiB0eXBlPSJ4c2w6YXZ0Ii8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idW5kZWNsYXJlLXByZWZpeGVzIiB0eXBlPSJ4c2w6YXZ0Ii8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idXNlLWNoYXJhY3Rlci1tYXBzIiB0eXBlPSJ4c2w6UU5hbWVzIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ib3V0cHV0LXZlcnNpb24iIHR5cGU9InhzbDphdnQiLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9InNlcXVlbmNlIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmluc3RydWN0aW9uIj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0idHJ1ZSI+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3RvciI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2VsZWN0IiB0eXBlPSJ4c2w6ZXhwcmVzc2lvbiIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImFzIiB0eXBlPSJ4c2w6c2VxdWVuY2UtdHlwZSIvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0ic29ydCI+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3IiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNlbGVjdCIgdHlwZT0ieHNsOmV4cHJlc3Npb24iLz4gIAotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImxhbmciIHR5cGU9InhzbDphdnQiLz4gICAgICAgIAotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImRhdGEtdHlwZSIgdHlwZT0ieHNsOmF2dCIgZGVmYXVsdD0idGV4dCIvPiAgICAgICAgCi0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ib3JkZXIiIHR5cGU9InhzbDphdnQiIGRlZmF1bHQ9ImFzY2VuZGluZyIvPiAgICAgICAgCi0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY2FzZS1vcmRlciIgdHlwZT0ieHNsOmF2dCIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNvbGxhdGlvbiIgdHlwZT0ieHNsOmF2dCIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InN0YWJsZSIgdHlwZT0ieHNsOnllcy1vci1ubyIvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0ic3RyaXAtc3BhY2UiIHN1YnN0aXR1dGlvbkdyb3VwPSJ4c2w6ZGVjbGFyYXRpb24iPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6ZWxlbWVudC1vbmx5LXZlcnNpb25lZC1lbGVtZW50LXR5cGUiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImVsZW1lbnRzIiB0eXBlPSJ4c2w6bmFtZXRlc3RzIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJzdHlsZXNoZWV0IiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOnRyYW5zZm9ybSIvPgotCi08eHM6ZWxlbWVudCBuYW1lPSJ0ZW1wbGF0ZSIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDpkZWNsYXJhdGlvbiI+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6dmVyc2lvbmVkLWVsZW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzbDpwYXJhbSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgIDx4czpncm91cCByZWY9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3Rvci1ncm91cCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1hdGNoIiB0eXBlPSJ4c2w6cGF0dGVybiIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InByaW9yaXR5IiB0eXBlPSJ4czpkZWNpbWFsIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibW9kZSIgdHlwZT0ieHNsOm1vZGVzIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNsOlFOYW1lIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYXMiIHR5cGU9InhzbDpzZXF1ZW5jZS10eXBlIiBkZWZhdWx0PSJpdGVtKCkqIi8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6Y29tcGxleFR5cGUgbmFtZT0idGV4dC1lbGVtZW50LWJhc2UtdHlwZSI+Ci0gIDx4czpzaW1wbGVDb250ZW50PgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4c2w6dmVyc2lvbmVkLWVsZW1lbnQtdHlwZSI+Ci0gICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyIvPgotICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVDb250ZW50PgotPC94czpjb21wbGV4VHlwZT4KLQotPHhzOmVsZW1lbnQgbmFtZT0idGV4dCIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDppbnN0cnVjdGlvbiI+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOnRleHQtZWxlbWVudC1iYXNlLXR5cGUiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImRpc2FibGUtb3V0cHV0LWVzY2FwaW5nIiB0eXBlPSJ4c2w6eWVzLW9yLW5vIiBkZWZhdWx0PSJubyIvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNmb3JtLWVsZW1lbnQtYmFzZS10eXBlIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4c2w6ZWxlbWVudC1vbmx5LXZlcnNpb25lZC1lbGVtZW50LXR5cGUiPgotICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJ4czpkZWNpbWFsIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotPC94czpjb21wbGV4VHlwZT4KLQotPHhzOmVsZW1lbnQgbmFtZT0idHJhbnNmb3JtIj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOnRyYW5zZm9ybS1lbGVtZW50LWJhc2UtdHlwZSI+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzbDppbXBvcnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4c2w6ZGVjbGFyYXRpb24iLz4KLSAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieHNsOnZhcmlhYmxlIi8+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzbDpwYXJhbSIvPiAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4gPCEtLSB3ZWFrZXIgdGhhbiBYU0xUIDEuMCAtLT4KLSAgICAgICAgICA8L3hzOmNob2ljZT4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHM6SUQiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0LXZhbGlkYXRpb24iIHR5cGU9InhzbDp2YWxpZGF0aW9uLXN0cmlwLW9yLXByZXNlcnZlIiBkZWZhdWx0PSJzdHJpcCIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImlucHV0LXR5cGUtYW5ub3RhdGlvbnMiIHR5cGU9InhzbDppbnB1dC10eXBlLWFubm90YXRpb25zLXR5cGUiIGRlZmF1bHQ9InVuc3BlY2lmaWVkIi8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJ2YWx1ZS1vZiIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDppbnN0cnVjdGlvbiI+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3IiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNlbGVjdCIgdHlwZT0ieHNsOmV4cHJlc3Npb24iLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzZXBhcmF0b3IiIHR5cGU9InhzbDphdnQiLz4gICAgICAgICAgICAKLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkaXNhYmxlLW91dHB1dC1lc2NhcGluZyIgdHlwZT0ieHNsOnllcy1vci1ubyIgZGVmYXVsdD0ibm8iLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9InZhcmlhYmxlIj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0idHJ1ZSI+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3RvciI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNsOlFOYW1lIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2VsZWN0IiB0eXBlPSJ4c2w6ZXhwcmVzc2lvbiIgdXNlPSJvcHRpb25hbCIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImFzIiB0eXBlPSJ4c2w6c2VxdWVuY2UtdHlwZSIgdXNlPSJvcHRpb25hbCIvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0id2hlbiI+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3IiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InRlc3QiIHR5cGU9InhzbDpleHByZXNzaW9uIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJ3aXRoLXBhcmFtIj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0idHJ1ZSI+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3RvciI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNsOlFOYW1lIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2VsZWN0IiB0eXBlPSJ4c2w6ZXhwcmVzc2lvbiIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImFzIiB0eXBlPSJ4c2w6c2VxdWVuY2UtdHlwZSIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR1bm5lbCIgdHlwZT0ieHNsOnllcy1vci1ubyIvPiAgIAotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPCEtLSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KLTx4czphbm5vdGF0aW9uPgotICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICBQQVJUIEM6IGRlZmluaXRpb24gb2YgbGl0ZXJhbCByZXN1bHQgZWxlbWVudHMKLSAgICAKLSAgICBUaGVyZSBhcmUgdGhyZWUgd2F5cyB0byBkZWZpbmUgdGhlIGxpdGVyYWwgcmVzdWx0IGVsZW1lbnRzCi0gICAgcGVybWlzc2libGUgaW4gYSBzdHlsZXNoZWV0LgotICAgIAotICAgIChhKSBkbyBub3RoaW5nLiBUaGlzIGFsbG93cyBhbnkgZWxlbWVudCB0byBiZSB1c2VkIGFzIGEgbGl0ZXJhbAotICAgICAgICByZXN1bHQgZWxlbWVudCwgcHJvdmlkZWQgaXQgaXMgbm90IGluIHRoZSBYU0xUIG5hbWVzcGFjZQotICAgIAotICAgIChiKSBkZWNsYXJlIGFsbCBwZXJtaXR0ZWQgbGl0ZXJhbCByZXN1bHQgZWxlbWVudHMgYXMgbWVtYmVycwotICAgICAgICBvZiB0aGUgeHNsOmxpdGVyYWwtcmVzdWx0LWVsZW1lbnQgc3Vic3RpdHV0aW9uIGdyb3VwCi0gICAgICAgIAotICAgIChjKSByZWRlZmluZSB0aGUgbW9kZWwgZ3JvdXAgeHNsOnJlc3VsdC1lbGVtZW50cyB0byBhY2NvbW1vZGF0ZQotICAgICAgICBhbGwgcGVybWl0dGVkIGxpdGVyYWwgcmVzdWx0IGVsZW1lbnRzLgotICAgICAgICAKLSAgICBMaXRlcmFsIHJlc3VsdCBlbGVtZW50cyBhcmUgYWxsb3dlZCB0byB0YWtlIGNlcnRhaW4gYXR0cmlidXRlcwotICAgIGluIHRoZSBYU0xUIG5hbWVzcGFjZS4gVGhlc2UgYXJlIGRlZmluZWQgaW4gdGhlIGF0dHJpYnV0ZSBncm91cAotICAgIGxpdGVyYWwtcmVzdWx0LWVsZW1lbnQtYXR0cmlidXRlcywgd2hpY2ggY2FuIGJlIGluY2x1ZGVkIGluIHRoZQotICAgIGRlZmluaXRpb24gb2YgYW55IGxpdGVyYWwgcmVzdWx0IGVsZW1lbnQuCi0gICAgCi0gIDwveHM6ZG9jdW1lbnRhdGlvbj4KLTwveHM6YW5ub3RhdGlvbj4gICAKLTwhLS0gKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+Ci0KLTx4czplbGVtZW50IG5hbWU9ImxpdGVyYWwtcmVzdWx0LWVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiB0eXBlPSJ4czphbnlUeXBlIi8+Ci0KLTx4czphdHRyaWJ1dGVHcm91cCBuYW1lPSJsaXRlcmFsLXJlc3VsdC1lbGVtZW50LWF0dHJpYnV0ZXMiPgotICA8eHM6YXR0cmlidXRlIG5hbWU9ImRlZmF1bHQtY29sbGF0aW9uIiBmb3JtPSJxdWFsaWZpZWQiIHR5cGU9InhzbDp1cmktbGlzdCIvPgotICA8eHM6YXR0cmlidXRlIG5hbWU9ImV4dGVuc2lvbi1lbGVtZW50LXByZWZpeGVzIiBmb3JtPSJxdWFsaWZpZWQiIHR5cGU9InhzbDpwcmVmaXhlcyIvPgotICA8eHM6YXR0cmlidXRlIG5hbWU9ImV4Y2x1ZGUtcmVzdWx0LXByZWZpeGVzIiBmb3JtPSJxdWFsaWZpZWQiIHR5cGU9InhzbDpwcmVmaXhlcyIvPgotICA8eHM6YXR0cmlidXRlIG5hbWU9InhwYXRoLWRlZmF1bHQtbmFtZXNwYWNlIiBmb3JtPSJxdWFsaWZpZWQiIHR5cGU9InhzOmFueVVSSSIvPiAgICAKLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJpbmhlcml0LW5hbWVzcGFjZXMiIGZvcm09InF1YWxpZmllZCIgdHlwZT0ieHNsOnllcy1vci1ubyIgZGVmYXVsdD0ieWVzIi8+Ci0gIDx4czphdHRyaWJ1dGUgbmFtZT0idXNlLWF0dHJpYnV0ZS1zZXRzIiBmb3JtPSJxdWFsaWZpZWQiIHR5cGU9InhzbDpRTmFtZXMiIGRlZmF1bHQ9IiIvPgotICA8eHM6YXR0cmlidXRlIG5hbWU9InVzZS13aGVuIiBmb3JtPSJxdWFsaWZpZWQiIHR5cGU9InhzbDpleHByZXNzaW9uIi8+Ci0gIDx4czphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgZm9ybT0icXVhbGlmaWVkIiB0eXBlPSJ4czpkZWNpbWFsIi8+Ci0gIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgZm9ybT0icXVhbGlmaWVkIiB0eXBlPSJ4c2w6UU5hbWUiLz4KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2YWxpZGF0aW9uIiBmb3JtPSJxdWFsaWZpZWQiIHR5cGU9InhzbDp2YWxpZGF0aW9uLXR5cGUiLz4KLTwveHM6YXR0cmlidXRlR3JvdXA+Ci0KLTx4czpncm91cCBuYW1lPSJyZXN1bHQtZWxlbWVudHMiPgotICA8eHM6Y2hvaWNlPgotICAgIDx4czplbGVtZW50IHJlZj0ieHNsOmxpdGVyYWwtcmVzdWx0LWVsZW1lbnQiLz4KLSAgICA8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgICA8eHM6YW55IG5hbWVzcGFjZT0iIyNsb2NhbCIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgPC94czpjaG9pY2U+Ci08L3hzOmdyb3VwPgotCi0KLTwhLS0gKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+Ci08eHM6YW5ub3RhdGlvbj4KLSAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgUEFSVCBEOiBkZWZpbml0aW9ucyBvZiBzaW1wbGUgdHlwZXMgdXNlZCBpbiBzdHlsZXNoZWV0IGF0dHJpYnV0ZXMgCi0gIDwveHM6ZG9jdW1lbnRhdGlvbj4KLTwveHM6YW5ub3RhdGlvbj4gICAKLTwhLS0gKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+Ci0KLTx4czpzaW1wbGVUeXBlIG5hbWU9ImF2dCI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgVGhpcyB0eXBlIGlzIHVzZWQgZm9yIGFsbCBhdHRyaWJ1dGVzIHRoYXQgYWxsb3cgYW4gYXR0cmlidXRlIHZhbHVlIHRlbXBsYXRlLgotICAgICAgVGhlIGdlbmVyYWwgcnVsZXMgZm9yIHRoZSBzeW50YXggb2YgYXR0cmlidXRlIHZhbHVlIHRlbXBsYXRlcywgYW5kIHRoZSBzcGVjaWZpYwotICAgICAgcnVsZXMgZm9yIGVhY2ggc3VjaCBhdHRyaWJ1dGUsIGFyZSBkZXNjcmliZWQgaW4gdGhlIFhTTFQgMi4wIFJlY29tbWVuZGF0aW9uLgotICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIi8+Ci08L3hzOnNpbXBsZVR5cGU+Ci0KLTx4czpzaW1wbGVUeXBlIG5hbWU9ImNoYXIiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIEEgc3RyaW5nIGNvbnRhaW5pbmcgZXhhY3RseSBvbmUgY2hhcmFjdGVyLgotICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLSAgICA8eHM6bGVuZ3RoIHZhbHVlPSIxIi8+Ci0gIDwveHM6cmVzdHJpY3Rpb24+Ci08L3hzOnNpbXBsZVR5cGU+Ci0KLTx4czpzaW1wbGVUeXBlIG5hbWU9ImV4cHJlc3Npb24iPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIEFuIFhQYXRoIDIuMCBleHByZXNzaW9uLgotICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgIDx4czpwYXR0ZXJuIHZhbHVlPSIuKyIvPgotICA8L3hzOnJlc3RyaWN0aW9uPgotPC94czpzaW1wbGVUeXBlPgotCi08eHM6c2ltcGxlVHlwZSBuYW1lPSJpbnB1dC10eXBlLWFubm90YXRpb25zLXR5cGUiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIERlc2NyaWJlcyBob3cgdHlwZSBhbm5vdGF0aW9ucyBpbiBzb3VyY2UgZG9jdW1lbnRzIGFyZSBoYW5kbGVkLgotICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0icHJlc2VydmUiLz4KLSAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InN0cmlwIi8+ICAgCi0gICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ1bnNwZWNpZmllZCIvPiAgICAgICAgCi0gIDwveHM6cmVzdHJpY3Rpb24+Ci08L3hzOnNpbXBsZVR5cGU+Ci0KLTx4czpzaW1wbGVUeXBlIG5hbWU9ImxldmVsIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBUaGUgbGV2ZWwgYXR0cmlidXRlIG9mIHhzbDpudW1iZXI6IAotICAgICAgb25lIG9mIHNpbmdsZSwgbXVsdGlwbGUsIG9yIGFueS4KLSAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5DTmFtZSI+Ci0gICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJzaW5nbGUiLz4KLSAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im11bHRpcGxlIi8+Ci0gICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJhbnkiLz4KLSAgPC94czpyZXN0cmljdGlvbj4KLTwveHM6c2ltcGxlVHlwZT4KLQotPHhzOnNpbXBsZVR5cGUgbmFtZT0ibW9kZSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgVGhlIG1vZGUgYXR0cmlidXRlIG9mIHhzbDphcHBseS10ZW1wbGF0ZXM6IAotICAgICAgZWl0aGVyIGEgUU5hbWUsIG9yICNjdXJyZW50LCBvciAjZGVmYXVsdC4KLSAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOnVuaW9uIG1lbWJlclR5cGVzPSJ4c2w6UU5hbWUiPgotICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KLSAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIjZGVmYXVsdCIvPgotICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IiNjdXJyZW50Ii8+Ci0gICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgPC94czp1bmlvbj4KLTwveHM6c2ltcGxlVHlwZT4KLQotPHhzOnNpbXBsZVR5cGUgbmFtZT0ibW9kZXMiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIFRoZSBtb2RlIGF0dHJpYnV0ZSBvZiB4c2w6dGVtcGxhdGU6IAotICAgICAgZWl0aGVyIGEgbGlzdCwgZWFjaCBtZW1iZXIgYmVpbmcgZWl0aGVyIGEgUU5hbWUgb3IgI2RlZmF1bHQ7Ci0gICAgICBvciB0aGUgdmFsdWUgI2FsbAotICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6dW5pb24+Ci0gICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICA8eHM6bGlzdD4KLSAgICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgPHhzOnVuaW9uIG1lbWJlclR5cGVzPSJ4c2w6UU5hbWUiPgotICAgICAgICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+Ci0gICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIjZGVmYXVsdCIvPgotICAgICAgICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICAgICAgIDwveHM6dW5pb24+Ci0gICAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICAgIDwveHM6bGlzdD4KLSAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IiNhbGwiLz4KLSAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgPC94czpzaW1wbGVUeXBlPgotICA8L3hzOnVuaW9uPgotPC94czpzaW1wbGVUeXBlPgotCi08eHM6c2ltcGxlVHlwZSBuYW1lPSJuYW1ldGVzdHMiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIEEgbGlzdCBvZiBOYW1lVGVzdHMsIGFzIGRlZmluZWQgaW4gdGhlIFhQYXRoIDIuMCBSZWNvbW1lbmRhdGlvbi4KLSAgICAgIEVhY2ggTmFtZVRlc3QgaXMgZWl0aGVyIGEgUU5hbWUsIG9yICIqIiwgb3IgInByZWZpeDoqIiwgb3IgIio6bG9jYWxuYW1lIgotICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6bGlzdD4KLSAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgIDx4czp1bmlvbiBtZW1iZXJUeXBlcz0ieHNsOlFOYW1lIj4KLSAgICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iKiIvPgotICAgICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KLSAgICAgICAgICAgIDx4czpwYXR0ZXJuIHZhbHVlPSJcaVxjKjpcKiIvPgotICAgICAgICAgICAgPHhzOnBhdHRlcm4gdmFsdWU9IlwqOlxpXGMqIi8+ICAgICAgICAgICAgCi0gICAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICAgPC94czp1bmlvbj4KLSAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gIDwveHM6bGlzdD4KLTwveHM6c2ltcGxlVHlwZT4KLQotPHhzOnNpbXBsZVR5cGUgbmFtZT0icHJlZml4ZXMiPgotICA8eHM6bGlzdCBpdGVtVHlwZT0ieHM6TkNOYW1lIi8+Ci08L3hzOnNpbXBsZVR5cGU+Ci0KLTx4czpzaW1wbGVUeXBlIG5hbWU9InByZWZpeC1saXN0LW9yLWFsbCI+Ci0gIDx4czp1bmlvbiBtZW1iZXJUeXBlcz0ieHNsOnByZWZpeC1saXN0Ij4KLSAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+Ci0gICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iI2FsbCIvPgotICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gIDwveHM6dW5pb24+Ci08L3hzOnNpbXBsZVR5cGU+Ci0gICAgICAKLTx4czpzaW1wbGVUeXBlIG5hbWU9InByZWZpeC1saXN0Ij4KLSAgPHhzOmxpc3QgaXRlbVR5cGU9InhzbDpwcmVmaXgtb3ItZGVmYXVsdCIvPgotPC94czpzaW1wbGVUeXBlPgotCi08eHM6c2ltcGxlVHlwZSBuYW1lPSJtZXRob2QiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIFRoZSBtZXRob2QgYXR0cmlidXRlIG9mIHhzbDpvdXRwdXQ6Ci0gICAgICBFaXRoZXIgb25lIG9mIHRoZSByZWNvZ25pemVkIG5hbWVzICJ4bWwiLCAieGh0bWwiLCAiaHRtbCIsICJ0ZXh0IiwKLSAgICAgIG9yIGEgUU5hbWUgdGhhdCBtdXN0IGluY2x1ZGUgYSBwcmVmaXguCi0gICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czp1bmlvbj4KLSAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOQ05hbWUiPgotICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InhtbCIvPgotICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InhodG1sIi8+Ci0gICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iaHRtbCIvPgotICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InRleHQiLz4KLSAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgPC94czpzaW1wbGVUeXBlPgotICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzbDpRTmFtZSI+Ci0gICAgICAgIDx4czpwYXR0ZXJuIHZhbHVlPSJcYyo6XGMqIi8+Ci0gICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgPC94czp1bmlvbj4KLTwveHM6c2ltcGxlVHlwZT4KLQotPHhzOnNpbXBsZVR5cGUgbmFtZT0icGF0dGVybiI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgQSBtYXRjaCBwYXR0ZXJuIGFzIGRlZmluZWQgaW4gdGhlIFhTTFQgMi4wIFJlY29tbWVuZGF0aW9uLgotICAgICAgVGhlIHN5bnRheCBmb3IgcGF0dGVybnMgaXMgYSByZXN0cmljdGVkIGZvcm0gb2YgdGhlIHN5bnRheCBmb3IKLSAgICAgIFhQYXRoIDIuMCBleHByZXNzaW9ucy4KLSAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzbDpleHByZXNzaW9uIi8+Ci08L3hzOnNpbXBsZVR5cGU+Ci0KLTx4czpzaW1wbGVUeXBlIG5hbWU9InByZWZpeC1vci1kZWZhdWx0Ij4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBFaXRoZXIgYSBuYW1lc3BhY2UgcHJlZml4LCBvciAjZGVmYXVsdC4KLSAgICAgIFVzZWQgaW4gdGhlIHhzbDpuYW1lc3BhY2UtYWxpYXMgZWxlbWVudC4KLSAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOnVuaW9uIG1lbWJlclR5cGVzPSJ4czpOQ05hbWUiPgotICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KLSAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIjZGVmYXVsdCIvPgotICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gIDwveHM6dW5pb24+Ci08L3hzOnNpbXBsZVR5cGU+Ci0KLTx4czpzaW1wbGVUeXBlIG5hbWU9IlFOYW1lcyI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgQSBsaXN0IG9mIFFOYW1lcy4KLSAgICAgIFVzZWQgaW4gdGhlIFt4c2w6XXVzZS1hdHRyaWJ1dGUtc2V0cyBhdHRyaWJ1dGUgb2YgdmFyaW91cyBlbGVtZW50cywKLSAgICAgIGFuZCBpbiB0aGUgY2RhdGEtc2VjdGlvbi1lbGVtZW50cyBhdHRyaWJ1dGUgb2YgeHNsOm91dHB1dAotICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6bGlzdCBpdGVtVHlwZT0ieHNsOlFOYW1lIi8+ICAgICAgICAgIAotPC94czpzaW1wbGVUeXBlPgotCi08eHM6c2ltcGxlVHlwZSBuYW1lPSJRTmFtZSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgQSBRTmFtZS4KLSAgICAgIFRoaXMgc2NoZW1hIGRvZXMgbm90IHVzZSB0aGUgYnVpbHQtaW4gdHlwZSB4czpRTmFtZSwgYnV0IHJhdGhlciBkZWZpbmVzIGl0cyBvd24KLSAgICAgIFFOYW1lIHR5cGUuIEFsdGhvdWdoIHhzOlFOYW1lIHdvdWxkIGRlZmluZSB0aGUgY29ycmVjdCB2YWxpZGF0aW9uIG9uIHRoZXNlIGF0dHJpYnV0ZXMsCi0gICAgICBhIHNjaGVtYSBwcm9jZXNzb3Igd291bGQgZXhwYW5kIHVucHJlZml4ZWQgUU5hbWVzIGluY29ycmVjdGx5IHdoZW4gY29uc3RydWN0aW5nIHRoZSBQU1ZJLAotICAgICAgYmVjYXVzZSAoYXMgZGVmaW5lZCBpbiBYTUwgU2NoZW1hIGVycmF0YSkgYW4gdW5wcmVmaXhlZCB4czpRTmFtZSBpcyBhc3N1bWVkIHRvIGJlIGluCi0gICAgICB0aGUgZGVmYXVsdCBuYW1lc3BhY2UsIHdoaWNoIGlzIG5vdCB0aGUgY29ycmVjdCBhc3N1bXB0aW9uIGZvciBYU0xULgotICAgICAgVGhlIGRhdGEgdHlwZSBpcyBkZWZpbmVkIGFzIGEgcmVzdHJpY3Rpb24gb2YgdGhlIGJ1aWx0LWluIHR5cGUgTmFtZSwgcmVzdHJpY3RlZAotICAgICAgc28gdGhhdCBpdCBjYW4gb25seSBjb250YWluIG9uZSBjb2xvbiB3aGljaCBtdXN0IG5vdCBiZSB0aGUgZmlyc3Qgb3IgbGFzdCBjaGFyYWN0ZXIuCi0gICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOYW1lIj4KLSAgICA8eHM6cGF0dGVybiB2YWx1ZT0iKFteOl0rOik/W146XSsiLz4gICAgICAKLSAgPC94czpyZXN0cmljdGlvbj4gICAgICAgIAotPC94czpzaW1wbGVUeXBlPgotCi08eHM6c2ltcGxlVHlwZSBuYW1lPSJzZXF1ZW5jZS10eXBlIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBUaGUgZGVzY3JpcHRpb24gb2YgYSBkYXRhIHR5cGUsIGNvbmZvcm1pbmcgdG8gdGhlCi0gICAgICBTZXF1ZW5jZVR5cGUgcHJvZHVjdGlvbiBkZWZpbmVkIGluIHRoZSBYUGF0aCAyLjAgUmVjb21tZW5kYXRpb24KLSAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KLSAgICA8eHM6cGF0dGVybiB2YWx1ZT0iLisiLz4gICAgICAKLSAgPC94czpyZXN0cmljdGlvbj4KLTwveHM6c2ltcGxlVHlwZT4KLQotPHhzOnNpbXBsZVR5cGUgbmFtZT0idXJpLWxpc3QiPgotICA8eHM6bGlzdCBpdGVtVHlwZT0ieHM6YW55VVJJIi8+Ci08L3hzOnNpbXBsZVR5cGU+Ci0KLTx4czpzaW1wbGVUeXBlIG5hbWU9InZhbGlkYXRpb24tc3RyaXAtb3ItcHJlc2VydmUiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIERlc2NyaWJlcyBkaWZmZXJlbnQgd2F5cyBvZiB0eXBlLWFubm90YXRpbmcgYW4gZWxlbWVudCBvciBhdHRyaWJ1dGUuCi0gICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4c2w6dmFsaWRhdGlvbi10eXBlIj4KLSAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InByZXNlcnZlIi8+Ci0gICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJzdHJpcCIvPiAgICAKLSAgPC94czpyZXN0cmljdGlvbj4KLTwveHM6c2ltcGxlVHlwZT4KLQotPHhzOnNpbXBsZVR5cGUgbmFtZT0idmFsaWRhdGlvbi10eXBlIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBEZXNjcmliZXMgZGlmZmVyZW50IHdheXMgb2YgdHlwZS1hbm5vdGF0aW5nIGFuIGVsZW1lbnQgb3IgYXR0cmlidXRlLgotICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ic3RyaWN0Ii8+Ci0gICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJsYXgiLz4KLSAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InByZXNlcnZlIi8+Ci0gICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJzdHJpcCIvPiAgICAKLSAgPC94czpyZXN0cmljdGlvbj4KLTwveHM6c2ltcGxlVHlwZT4KLQotPHhzOnNpbXBsZVR5cGUgbmFtZT0ieWVzLW9yLW5vIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBPbmUgb2YgdGhlIHZhbHVlcyAieWVzIiBvciAibm8iLgotICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ieWVzIi8+Ci0gICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJubyIvPgotICA8L3hzOnJlc3RyaWN0aW9uPgotPC94czpzaW1wbGVUeXBlPgotCi08eHM6c2ltcGxlVHlwZSBuYW1lPSJ5ZXMtb3Itbm8tb3Itb21pdCI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgT25lIG9mIHRoZSB2YWx1ZXMgInllcyIgb3IgIm5vIiBvciAib21pdCIuCi0gICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+Ci0gICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ5ZXMiLz4KLSAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im5vIi8+Ci0gICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJvbWl0Ii8+Ci0gIDwveHM6cmVzdHJpY3Rpb24+Ci08L3hzOnNpbXBsZVR5cGU+Ci0KLTwveHM6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNGU4NjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM2MDI5Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotamF2YUNvbXBpbGVyLi4uYXJncwotYnVpbGQueG1sCi1AZG90Ci10ZW1wLmZvbGRlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjlkMGIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhN2JiNmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1RodSBKYW4gMDMgMjI6MjQ6MDEgRVNUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MzA2N2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSNGcmkgSmFuIDA0IDAxOjA1OjMzIEVTVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRkODU2OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSNGcmkgSmFuIDA0IDA5OjA0OjQzIEVTVCAyMDA4Ci1jb21waWxlcnMuaW5jb21wYXRpYmxlLWVudmlyb25tZW50PTEKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAubWlzc2luZy1idW5kbGUtY2xhc3NwYXRoLWVudHJpZXM9MAotY29tcGlsZXJzLnAubWlzc2luZy1wYWNrYWdlcz0yCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0xCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0xCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZjRiYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAwLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuWFNMRGVidWdVSVBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS5jb3JlLnZhcmlhYmxlcywKLSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLAotIG9yZy5lY2xpcHNlLmRlYnVnLnVpLAotIG9yZy5lY2xpcHNlLmpkdC5kZWJ1Zy51aSwKLSBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQsCi0gb3JnLmVjbGlwc2UudWkuZWRpdG9ycywKLSBvcmcuZWNsaXBzZS51aS5pZGUsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aSwKLSBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZywKLSBvcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLAotIG9yZy5lY2xpcHNlLnVpLmNvbnNvbGUKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNkYjM2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc4ZGEyMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBpY29ucy8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9pY29ucy9icmtwX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvaWNvbnMvYnJrcF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODMxZmU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9pY29ucy9icmtwX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvaWNvbnMvbG9jYWx2YXJpYWJsZV9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL2ljb25zL2xvY2FsdmFyaWFibGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI0NGIyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvaWNvbnMvbG9jYWx2YXJpYWJsZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL2ljb25zL3NhbXBsZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvaWNvbnMvc2FtcGxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRmYjNjOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvaWNvbnMvc2FtcGxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI5NTFmYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jUHJvcGVydGllcyBmaWxlIGZvciBvcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpCi1CdW5kbGUtTmFtZS4wID0gWFNMIERlYnVnIFVJIFBsdWctaW4gKEluY3ViYXRpbmcpCi1wYWdlLm5hbWUuMSA9IEluc3RhbGxlZCBQcm9jZXNzb3JzCi1wYWdlLm5hbWUuMiA9IEZlYXR1cmVzCi1wYWdlLm5hbWUuMyA9IE91dHB1dCBQcm9wZXJ0aWVzCi1sYXVuY2hNb2RlLmRlc2NyaXB0aW9uLjAgPSBDcmVhdGUgYSBjb25maWd1cmF0aW9uIHRvIGRlYnVnIGFuIFhTTFQgdHJhbnNmb3JtYXRpb24KLWxhdW5jaE1vZGUuZGVzY3JpcHRpb24uMSA9IENyZWF0ZSBhIGNvbmZpZ3VyYXRpb24gdG8gcnVuIGFuIFhTTFQgdHJhbnNmb3JtYXRpb24KLWNvbnRleHQuZGVzY3JpcHRpb24uMCA9IENvbnRleHQgZm9yIGRlYnVnZ2luZyBYU0xUCi1jb250ZXh0Lm5hbWUuMCA9IFhTTFQgRGVidWdnaW5nCi1zaG9ydGN1dC5sYWJlbC4wID0gWFNMIFRyYW5zZm9ybWF0aW9uCi1zaG9ydGN1dC5sYWJlbC4xID0gWFNMVCBUcmFuc2Zvcm1hdGlvbgotQnVuZGxlLVZlbmRvci4wID0gRWNsaXBzZS5vcmcKLWRlc2NyaXB0aW9uLmRlc2NyaXB0aW9uLjAgPSBSdW4gYW4gWFNMVCB0cmFuc2Zvcm1hdGlvbiB1c2luZyB0aGUgc2VsZWN0ZWQgZmlsZShzKQotZGVzY3JpcHRpb24uZGVzY3JpcHRpb24uMSA9IERlYnVnIGFuIFhTTFQgdHJhbnNmb3JtYXRpb24gdXNpbmcgdGhlIHNlbGVjdGVkIGZpbGUocykKLWRlc2NyaXB0aW9uLmRlc2NyaXB0aW9uLjIgPSBQcm9maWxlIGFuIFhTTFQgdHJhbnNmb3JtYXRpb24gdXNpbmcgdGhlIHNlbGVjdGVkIGZpbGUocykKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTJhZDY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08cGx1Z2luPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KLQkJPHBhZ2UKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3QueHNsLnVpLnByZWZlcmVuY2VzLkJhc2VQcmVmZXJlbmNlUGFnZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnByZWZlcmVuY2VzLlByb2Nlc3NvcnNQcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy51aS5wcmVmZXJlbmNlcy5Qcm9jZXNzb3JQcmVmZXJlbmNlUGFnZSIKLQkJCW5hbWU9IiVwYWdlLm5hbWUuMSI+Ci0JCTwvcGFnZT4KLQkJPHBhZ2UKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3QueHNsLnVpLnByZWZlcmVuY2VzLkJhc2VQcmVmZXJlbmNlUGFnZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnByZWZlcmVuY2VzLkZlYXR1cmVzUHJlZmVyZW5jZVBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS5wYWdlMSIgbmFtZT0iJXBhZ2UubmFtZS4yIiAvPgotCQk8cGFnZQotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC54c2wudWkucHJlZmVyZW5jZXMuQmFzZVByZWZlcmVuY2VQYWdlIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkucHJlZmVyZW5jZXMuT3V0cHV0UHJlZmVyZW5jZVBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS5vdXRwdXQiIG5hbWU9IiVwYWdlLm5hbWUuMyIgLz4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wZXJzcGVjdGl2ZUV4dGVuc2lvbnMiPgotCQk8cGVyc3BlY3RpdmVFeHRlbnNpb24KLQkJCXRhcmdldElEPSJvcmcuZWNsaXBzZS53c3QueG1sLnBlcnNwZWN0aXZlIj4KLQkJCTxhY3Rpb25TZXQgaWQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmRlYnVnQWN0aW9uU2V0IiAvPgotCQkJPGFjdGlvblNldCBpZD0ib3JnLmVjbGlwc2UuZGVidWcudWkubGF1bmNoQWN0aW9uU2V0IiAvPgotCQkJPGFjdGlvblNldCBpZD0ib3JnLmVjbGlwc2UuZGVidWcudWkuYnJlYWtwb2ludEFjdGlvblNldCIgLz4KLQkJCTxhY3Rpb25TZXQgaWQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLnByb2ZpbGVBY3Rpb25TZXQiIC8+Ci0JCTwvcGVyc3BlY3RpdmVFeHRlbnNpb24+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuZGVidWcudWkubGF1bmNoQ29uZmlndXJhdGlvblR5cGVJbWFnZXMiPgotCQk8bGF1bmNoQ29uZmlndXJhdGlvblR5cGVJbWFnZSBpY29uPSJpY29ucy9zYW1wbGUuZ2lmIgotCQkJY29uZmlnVHlwZUlEPSJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5sYXVuY2hDb25maWd1cmF0aW9uVHlwZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlSW1hZ2UiIC8+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5sYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXBzIj4KLQkJPGxhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cAotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuWFNMVFRhYkdyb3VwIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwLnhzbHQiCi0JCQl0eXBlPSJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5sYXVuY2hDb25maWd1cmF0aW9uVHlwZSI+Ci0JCQk8bGF1bmNoTW9kZSBkZXNjcmlwdGlvbj0iJWxhdW5jaE1vZGUuZGVzY3JpcHRpb24uMCIKLQkJCQltb2RlPSJkZWJ1ZyIgcGVyc3BlY3RpdmU9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLkRlYnVnUGVyc3BlY3RpdmUiIC8+Ci0JCQk8bGF1bmNoTW9kZSBkZXNjcmlwdGlvbj0iJWxhdW5jaE1vZGUuZGVzY3JpcHRpb24uMSIKLQkJCQltb2RlPSJydW4iIHBlcnNwZWN0aXZlPSJvcmcuZWNsaXBzZS53c3QueG1sLnBlcnNwZWN0aXZlIiAvPgotCQk8L2xhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cD4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jb250ZXh0cyI+Ci0JCTxjb250ZXh0IGRlc2NyaXB0aW9uPSIlY29udGV4dC5kZXNjcmlwdGlvbi4wIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkuY29udGV4dCIgbmFtZT0iJWNvbnRleHQubmFtZS4wIgotCQkJcGFyZW50SWQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmRlYnVnZ2luZyI+Ci0JCTwvY29udGV4dD4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmRlYnVnTW9kZWxQcmVzZW50YXRpb25zIj4KLQkJPGRlYnVnTW9kZWxQcmVzZW50YXRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLm1vZGVsLlhTTE1vZGVsUHJlc2VudGF0aW9uIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLlhTTERlYnVnTW9kZWwiPgotCQk8L2RlYnVnTW9kZWxQcmVzZW50YXRpb24+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5sYXVuY2hTaG9ydGN1dHMiPgotCQk8c2hvcnRjdXQKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLlhTTExhdW5jaFNob3J0Y3V0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkubGF1bmNoc2hvcnRjdXQiCi0JCQlsYWJlbD0iJXNob3J0Y3V0LmxhYmVsLjAiIG1vZGVzPSJydW4sIGRlYnVnLCBwcm9maWxlIj4KLQkJCTxjb250ZXh0dWFsTGF1bmNoPgotCQkJCTxlbmFibGVtZW50PgotCQkJCQk8d2l0aCB2YXJpYWJsZT0ic2VsZWN0aW9uIj4KLQkJCQkJCTxpdGVyYXRlPgotCQkJCQkJCTxhZGFwdAotCQkJCQkJCQl0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSI+Ci0JCQkJCQkJCTxvcj4KLQkJCQkJCQkJCTx0ZXN0Ci0JCQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLmNvbnRlbnRUeXBlSWQiCi0JCQkJCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiIC8+Ci0JCQkJCQkJCQk8dGVzdAotCQkJCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5jb250ZW50VHlwZUlkIgotCQkJCQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueG1sc291cmNlIiAvPgotCQkJCQkJCQkJPHRlc3QKLQkJCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuY29udGVudFR5cGVJZCIKLQkJCQkJCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhzbHNvdXJjZSIgLz4KLQkJCQkJCQkJPC9vcj4KLQkJCQkJCQk8L2FkYXB0PgotCQkJCQkJPC9pdGVyYXRlPgotCQkJCQk8L3dpdGg+Ci0JCQkJPC9lbmFibGVtZW50PgotCQkJPC9jb250ZXh0dWFsTGF1bmNoPgotCQkgICA8ZGVzY3JpcHRpb24KLQkJICAgICAgICAgZGVzY3JpcHRpb249IiVkZXNjcmlwdGlvbi5kZXNjcmlwdGlvbi4wIgotCQkgICAgICAgICBtb2RlPSJydW4iPgotCQkgICA8L2Rlc2NyaXB0aW9uPgotCQkgICA8ZGVzY3JpcHRpb24KLQkJICAgICAgICAgZGVzY3JpcHRpb249IiVkZXNjcmlwdGlvbi5kZXNjcmlwdGlvbi4xIgotCQkgICAgICAgICBtb2RlPSJkZWJ1ZyI+Ci0JCSAgIDwvZGVzY3JpcHRpb24+Ci0JCSAgIDxkZXNjcmlwdGlvbgotCQkgICAgICAgICBkZXNjcmlwdGlvbj0iJWRlc2NyaXB0aW9uLmRlc2NyaXB0aW9uLjIiCi0JCSAgICAgICAgIG1vZGU9InByb2ZpbGUiPgotCQkgICA8L2Rlc2NyaXB0aW9uPgotCQk8L3Nob3J0Y3V0PgotCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmRlYnVnTW9kZWxDb250ZXh0QmluZGluZ3MiPgotCQk8bW9kZWxDb250ZXh0QmluZGluZwotCQkJY29udGV4dElkPSJvcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpLmNvbnRleHQiCi0JCQlkZWJ1Z01vZGVsSWQ9Im9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLlhTTERlYnVnTW9kZWwiPgotCQk8L21vZGVsQ29udGV4dEJpbmRpbmc+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZGVidWcudWkuY29udGV4dFZpZXdCaW5kaW5ncyI+Ci0JCTxjb250ZXh0Vmlld0JpbmRpbmcgYXV0b09wZW49InRydWUiCi0JCQljb250ZXh0SWQ9Im9yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkuY29udGV4dCIKLQkJCXZpZXdJZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS54cGF0aC52aWV3Ij4KLQkJPC9jb250ZXh0Vmlld0JpbmRpbmc+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmJyZWFrcG9pbnQiPgotCQk8YnJlYWtwb2ludENvbnRyaWJ1dGlvbgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkucHJvdmlkZXJzIj4KLQkJCTxwcm92aWRlciBjb250ZW50VHlwZXM9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS54c2xzb3VyY2Usb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhtbHNvdXJjZSxvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLmJyZWFrcG9pbnQuWFNMQnJlYWtwb2ludFByb3ZpZGVyOip4c2wsKnhzbHQsKnhtbCIKLQkJCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS5YU0xCcmVha3BvaW50UHJvdmlkZXIiIC8+Ci0JCTwvYnJlYWtwb2ludENvbnRyaWJ1dGlvbj4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmNvbnNvbGVMaW5lVHJhY2tlcnMiPgotCQk8Y29uc29sZUxpbmVUcmFja2VyCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5YU0xDb25zb2xlTGluZVRyYWNrZXIiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5YU0xDb25zb2xlTGluZVRyYWNrZXIiCi0JCQlwcm9jZXNzVHlwZT0iamF2YSI+Ci0JCTwvY29uc29sZUxpbmVUcmFja2VyPgotCTwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9BYnN0cmFjdFRhYmxlQmxvY2suamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9BYnN0cmFjdFRhYmxlQmxvY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTEyMTVlOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvQWJzdHJhY3RUYWJsZUJsb2NrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuQWJzdHJhY3RMYXVuY2hDb25maWd1cmF0aW9uVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RUYWJsZUJsb2NrIGV4dGVuZHMgQWJzdHJhY3RMYXVuY2hDb25maWd1cmF0aW9uVGFiCi17Ci0JcHJpdmF0ZSBpbnQgZlNvcnRDb2x1bW47Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgVGFibGUgZ2V0VGFibGUoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBJRGlhbG9nU2V0dGluZ3MgZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0UXVhbGlmaWVyKCk7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTb3J0Q29sdW1uKGludCBjb2x1bW4pCi0JewotCQlmU29ydENvbHVtbiA9IGNvbHVtbjsKLQl9Ci0KLQkvKioKLQkgKiBQZXJzaXN0IHRhYmxlIHNldHRpbmdzIGludG8gdGhlIGdpdmUgZGlhbG9nIHN0b3JlLCBwcmVmaXhlZCB3aXRoIHRoZQotCSAqIGdpdmVuIGtleS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlQ29sdW1uU2V0dGluZ3MoKQotCXsKLQkJaW50IGNvbHVtbkNvdW50ID0gZ2V0VGFibGUoKS5nZXRDb2x1bW5Db3VudCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbkNvdW50OyBpKyspCi0JCXsKLQkJCWdldERpYWxvZ1NldHRpbmdzKCkucHV0KGdldFF1YWxpZmllcigpICsgIi5jb2x1bW5XaWR0aCIgKyBpLCBnZXRUYWJsZSgpLmdldENvbHVtbihpKS5nZXRXaWR0aCgpKTsKLQkJfQotCQlnZXREaWFsb2dTZXR0aW5ncygpLnB1dChnZXRRdWFsaWZpZXIoKSArICIuc29ydENvbHVtbiIsIGZTb3J0Q29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXN0b3JlIHRhYmxlIHNldHRpbmdzIGZyb20gdGhlIGdpdmVuIGRpYWxvZyBzdG9yZSB1c2luZyB0aGUgZ2l2ZW4ga2V5LgotCSAqIAotCSAqIEBwYXJhbSB3aWR0aHMKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXN0b3JlQ29sdW1uU2V0dGluZ3MoKQotCXsKLQkJZ2V0VGFibGUoKS5sYXlvdXQodHJ1ZSk7Ci0JCXJlc3RvcmVDb2x1bW5XaWR0aHMoZ2V0RGlhbG9nU2V0dGluZ3MoKSwgZ2V0UXVhbGlmaWVyKCkpOwotCQlpbnQgY29sID0gMDsKLQkJdHJ5Ci0JCXsKLQkJCWNvbCA9IGdldERpYWxvZ1NldHRpbmdzKCkuZ2V0SW50KGdldFF1YWxpZmllcigpICsgIi5zb3J0Q29sdW1uIik7Ci0JCX0KLQkJY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQljb2wgPSAxOwotCQl9Ci0JCXNldFNvcnRDb2x1bW4oY29sKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVzdG9yZUNvbHVtbldpZHRocyhJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MsIFN0cmluZyBxdWFsaWZpZXIpCi0JewotCQlpbnQgY29sdW1uQ291bnQgPSBnZXRUYWJsZSgpLmdldENvbHVtbkNvdW50KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uQ291bnQ7IGkrKykKLQkJewotCQkJaW50IHdpZHRoID0gLTE7Ci0JCQl0cnkKLQkJCXsKLQkJCQl3aWR0aCA9IHNldHRpbmdzLmdldEludChxdWFsaWZpZXIgKyAiLmNvbHVtbldpZHRoIiArIGkpOwotCQkJfQotCQkJY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKQotCQkJewotCQkJfQotCi0JCQlpZiAod2lkdGggPiAwKQotCQkJCWdldFRhYmxlKCkuZ2V0Q29sdW1uKGkpLnNldFdpZHRoKHdpZHRoKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotCXsKLQkJaWYgKGdldFRhYmxlKCkgIT0gbnVsbCAmJiAhZ2V0VGFibGUoKS5pc0Rpc3Bvc2VkKCkpCi0JCQlzYXZlQ29sdW1uU2V0dGluZ3MoKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9SZXNvdXJjZVNlbGVjdGlvbkJsb2NrLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvUmVzb3VyY2VTZWxlY3Rpb25CbG9jay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2Q4NTVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9SZXNvdXJjZVNlbGVjdGlvbkJsb2NrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUudmFyaWFibGVzLklTdHJpbmdWYXJpYWJsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS52YXJpYWJsZXMuVmFyaWFibGVzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuQWJzdHJhY3RMYXVuY2hDb25maWd1cmF0aW9uVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLlN0cmluZ1ZhcmlhYmxlU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5JU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLm5hdmlnYXRvci5SZXNvdXJjZUNvbXBhcmF0b3I7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZXNvdXJjZVNlbGVjdGlvbkJsb2NrIGV4dGVuZHMgQWJzdHJhY3RMYXVuY2hDb25maWd1cmF0aW9uVGFiCi17Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfRElSRUNUT1JZX05PVF9TUEVDSUZJRUQgPSAxOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0RJUkVDVE9SWV9ET0VTX05PVF9FWElTVCA9IDI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgR1JPVVBfTkFNRSA9IDM7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVVNFX0RFRkFVTFRfUkFESU8gPSA0OwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFVTRV9PVEhFUl9SQURJTyA9IDU7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRElSRUNUT1JZX0RJQUxPR19NRVNTQUdFID0gNjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBXT1JLU1BBQ0VfRElBTE9HX01FU1NBR0UgPSA3OwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFZBUklBQkxFU19CVVRUT04gPSA4OwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEZJTEVfU1lTVEVNX0JVVFRPTiA9IDk7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgV09SS1NQQUNFX0JVVFRPTiA9IDEwOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFdPUktTUEFDRV9ESUFMT0dfVElUTEUgPSAxMTsKLQotCXByb3RlY3RlZCBCdXR0b24gZldvcmtzcGFjZUJ1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZGaWxlU3lzdGVtQnV0dG9uOwotCXByb3RlY3RlZCBCdXR0b24gZlZhcmlhYmxlc0J1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIHVzZURlZmF1bHRDaGVja0J1dHRvbjsKLQlwcm90ZWN0ZWQgVGV4dCByZXNvdXJjZVRleHQ7Ci0JcHJvdGVjdGVkIFdpZGdldExpc3RlbmVyIHdpZGdldExpc3RlbmVyID0gbmV3IFdpZGdldExpc3RlbmVyKCk7Ci0JcHJpdmF0ZSBJTGF1bmNoQ29uZmlndXJhdGlvbiBmTGF1bmNoQ29uZmlndXJhdGlvbjsKLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBzaG93RGVmYXVsdDsKLQlwcml2YXRlIGZpbmFsIGludCByZXNvdXJjZVR5cGU7Ci0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIG11c3RFeGlzdDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXF1aXJlZDsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRPdXRwdXRGaWxlOwotCXByb3RlY3RlZCBTdHJpbmcgb3V0cHV0RmlsZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZpbGVMYWJlbCA9ICJGaWxlOiI7Ci0KLQlwcml2YXRlIGZpbmFsIElTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3IgdmFsaWRhdG9yID0gbmV3IElTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3IoKQotCXsKLQkJcHVibGljIElTdGF0dXMgdmFsaWRhdGUoT2JqZWN0W10gc2VsZWN0aW9uKQotCQl7Ci0JCQlpZiAoc2VsZWN0aW9uLmxlbmd0aCA9PSAwKQotCQkJewotCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFhTTERlYnVnVUlQbHVnaW4uUExVR0lOX0lELCAwLCAiIiwgbnVsbCk7IAotCQkJfQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3Rpb24ubGVuZ3RoOyBpKyspCi0JCQl7Ci0JCQkJaWYgKHJlc291cmNlVHlwZSA9PSBJUmVzb3VyY2UuRk9MREVSICYmICEoc2VsZWN0aW9uW2ldIGluc3RhbmNlb2YgSUZvbGRlcikpCi0JCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFhTTERlYnVnVUlQbHVnaW4uUExVR0lOX0lELCAwLCAiIiwgbnVsbCk7IAotCQkJCWVsc2UgaWYgKHJlc291cmNlVHlwZSA9PSBJUmVzb3VyY2UuRklMRSAmJiAhKHNlbGVjdGlvbltpXSBpbnN0YW5jZW9mIElGaWxlKSkKLQkJCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgWFNMRGVidWdVSVBsdWdpbi5QTFVHSU5fSUQsIDAsICIiLCBudWxsKTsgCi0JCQl9Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBYU0xEZWJ1Z1VJUGx1Z2luLlBMVUdJTl9JRCwgMCwgIiIsIG51bGwpOyAKLQkJfQotCX07Ci0KLQljbGFzcyBXaWRnZXRMaXN0ZW5lciBleHRlbmRzIFNlbGVjdGlvbkFkYXB0ZXIgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lcgotCXsKLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKQotCQl7Ci0JCQl0ZXh0TW9kaWZpZWQoKTsKLQkJCXVwZGF0ZUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotCQl7Ci0JCQlPYmplY3Qgc291cmNlID0gZS5nZXRTb3VyY2UoKTsKLQkJCWlmIChzb3VyY2UgPT0gZldvcmtzcGFjZUJ1dHRvbikKLQkJCXsKLQkJCQloYW5kbGVXb3Jrc3BhY2VSZXNvdXJjZUJyb3dzZUJ1dHRvblNlbGVjdGVkKCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChzb3VyY2UgPT0gZkZpbGVTeXN0ZW1CdXR0b24pCi0JCQl7Ci0JCQkJaGFuZGxlRXh0ZXJuYWxSZXNvdXJjZUJyb3dzZUJ1dHRvblNlbGVjdGVkKCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChzb3VyY2UgPT0gZlZhcmlhYmxlc0J1dHRvbikKLQkJCXsKLQkJCQloYW5kbGVSZXNvdXJjZVZhcmlhYmxlc0J1dHRvblNlbGVjdGVkKCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChzb3VyY2UgPT0gdXNlRGVmYXVsdENoZWNrQnV0dG9uKQotCQkJewotCQkJCXVwZGF0ZVJlc291cmNlVGV4dCh1c2VEZWZhdWx0Q2hlY2tCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIFJlc291cmNlU2VsZWN0aW9uQmxvY2soKQotCXsKLQkJdGhpcyh0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2VTZWxlY3Rpb25CbG9jayhib29sZWFuIHNob3dEZWZhdWx0KQotCXsKLQkJdGhpcyhJUmVzb3VyY2UuRk9MREVSLCBzaG93RGVmYXVsdCk7Ci0JfQotCi0JcHVibGljIFJlc291cmNlU2VsZWN0aW9uQmxvY2soaW50IHJlc291cmNlVHlwZSwgYm9vbGVhbiBzaG93RGVmYXVsdCkKLQl7Ci0JCXRoaXMocmVzb3VyY2VUeXBlLCBzaG93RGVmYXVsdCwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIFJlc291cmNlU2VsZWN0aW9uQmxvY2soaW50IHJlc291cmNlVHlwZSwgYm9vbGVhbiBzaG93RGVmYXVsdCwgYm9vbGVhbiByZXF1aXJlZCkKLQl7Ci0JCXRoaXMocmVzb3VyY2VUeXBlLCBzaG93RGVmYXVsdCwgcmVxdWlyZWQsIHRydWUpOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZVNlbGVjdGlvbkJsb2NrKGludCByZXNvdXJjZVR5cGUsIGJvb2xlYW4gc2hvd0RlZmF1bHQsIGJvb2xlYW4gcmVxdWlyZWQsIGJvb2xlYW4gbXVzdEV4aXN0KQotCXsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zaG93RGVmYXVsdCA9IHNob3dEZWZhdWx0OwotCQl0aGlzLnJlc291cmNlVHlwZSA9IHJlc291cmNlVHlwZTsKLQkJdGhpcy5yZXF1aXJlZCA9IHJlcXVpcmVkOwotCQl0aGlzLm11c3RFeGlzdCA9IG11c3RFeGlzdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpCi0JewotCQlDb21wb3NpdGUgZ3JvdXAgPSBjcmVhdGVDb250YWluZXIocGFyZW50KTsKLQkJc2V0Q29udHJvbChncm91cCk7Ci0JCWNyZWF0ZUNvbnRlbnRzKGdyb3VwKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZUNvbnRhaW5lcihDb21wb3NpdGUgcGFyZW50KQotCXsKLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWdyb3VwLnNldFRleHQoZ2V0TWVzc2FnZShHUk9VUF9OQU1FKSk7Ci0JCS8vIFRPRE8gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscC4uLgotCQlHcmlkTGF5b3V0IGdyb3VwTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ3JvdXBMYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWdyb3VwTGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IGZhbHNlOwotCQlncm91cC5zZXRMYXlvdXQoZ3JvdXBMYXlvdXQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlncm91cC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZ3JvdXAuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJcmV0dXJuIGdyb3VwOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpCi0JewotCQljcmVhdGVDaGVja2JveEFuZFRleHQocGFyZW50KTsKLQkJY3JlYXRlQnV0dG9ucyhwYXJlbnQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNoZWNrYm94QW5kVGV4dChDb21wb3NpdGUgcGFyZW50KQotCXsKLQkJaWYgKHNob3dEZWZhdWx0KQotCQl7Ci0JCQl1c2VEZWZhdWx0Q2hlY2tCdXR0b24gPSBjcmVhdGVDaGVja0J1dHRvbihwYXJlbnQsIGdldE1lc3NhZ2UoVVNFX0RFRkFVTFRfUkFESU8pKTsKLQkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJCXVzZURlZmF1bHRDaGVja0J1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCXVzZURlZmF1bHRDaGVja0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih3aWRnZXRMaXN0ZW5lcik7Ci0JCX0KLQotCQlDb21wb3NpdGUgc3BlY2lmaWNGaWxlQ29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlpZiAoc2hvd0RlZmF1bHQpCi0JCQlsYXlvdXQubWFyZ2luTGVmdCA9IDIwOwotCQllbHNlCi0JCQlsYXlvdXQubWFyZ2luTGVmdCA9IDA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlzcGVjaWZpY0ZpbGVDb21wLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXNwZWNpZmljRmlsZUNvbXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJaWYgKHNob3dEZWZhdWx0KQotCQl7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChzcGVjaWZpY0ZpbGVDb21wLCBTV1QuTk9ORSk7Ci0JCQlsYWJlbC5zZXRUZXh0KGZpbGVMYWJlbCk7Ci0JCX0KLQotCQlyZXNvdXJjZVRleHQgPSBuZXcgVGV4dChzcGVjaWZpY0ZpbGVDb21wLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gc2hvd0RlZmF1bHQgPyAxIDogMjsKLQkJcmVzb3VyY2VUZXh0LnNldExheW91dERhdGEoZ2QpOwotCQlyZXNvdXJjZVRleHQuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJcmVzb3VyY2VUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKHdpZGdldExpc3RlbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zKENvbXBvc2l0ZSBwYXJlbnQpCi0JewotCQkvLyBmaWxsZXIKLQkJbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCi0JCUNvbXBvc2l0ZSBidXR0b25Db21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgzLCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlidXR0b25Db21wLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMTsKLQkJYnV0dG9uQ29tcC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJYnV0dG9uQ29tcC5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCi0JCWZXb3Jrc3BhY2VCdXR0b24gPSBjcmVhdGVQdXNoQnV0dG9uKGJ1dHRvbkNvbXAsIGdldE1lc3NhZ2UoV09SS1NQQUNFX0JVVFRPTiksIG51bGwpOwotCQlmV29ya3NwYWNlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHdpZGdldExpc3RlbmVyKTsKLQotCQlmRmlsZVN5c3RlbUJ1dHRvbiA9IGNyZWF0ZVB1c2hCdXR0b24oYnV0dG9uQ29tcCwgZ2V0TWVzc2FnZShGSUxFX1NZU1RFTV9CVVRUT04pLCBudWxsKTsKLQkJZkZpbGVTeXN0ZW1CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIod2lkZ2V0TGlzdGVuZXIpOwotCi0JCWZWYXJpYWJsZXNCdXR0b24gPSBjcmVhdGVQdXNoQnV0dG9uKGJ1dHRvbkNvbXAsIGdldE1lc3NhZ2UoVkFSSUFCTEVTX0JVVFRPTiksIG51bGwpOwotCQlmVmFyaWFibGVzQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHdpZGdldExpc3RlbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVSZXNvdXJjZVRleHQoYm9vbGVhbiB1c2VEZWZhdWx0KQotCXsKLQkJaWYgKHVzZURlZmF1bHQpCi0JCXsKLQkJCXJlc291cmNlVGV4dC5zZXRUZXh0KGRlZmF1bHRPdXRwdXRGaWxlID09IG51bGwgPyAiIiA6IGRlZmF1bHRPdXRwdXRGaWxlKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXJlc291cmNlVGV4dC5zZXRUZXh0KG91dHB1dEZpbGUgPT0gbnVsbCA/ICIiIDogb3V0cHV0RmlsZSk7Ci0JCX0KLQkJcmVzb3VyY2VUZXh0LnNldEVuYWJsZWQoIXVzZURlZmF1bHQpOwotCQlmRmlsZVN5c3RlbUJ1dHRvbi5zZXRFbmFibGVkKCF1c2VEZWZhdWx0KTsKLQkJZlZhcmlhYmxlc0J1dHRvbi5zZXRFbmFibGVkKCF1c2VEZWZhdWx0KTsKLQkJZldvcmtzcGFjZUJ1dHRvbi5zZXRFbmFibGVkKCF1c2VEZWZhdWx0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLQl7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlRXh0ZXJuYWxSZXNvdXJjZUJyb3dzZUJ1dHRvblNlbGVjdGVkKCkKLQl7Ci0JCVN0cmluZyBjdXJyZW50V29ya2luZ0RpciA9IGdldFRleHQoKTsKLQkJU3RyaW5nIHNlbGVjdGVkID0gbnVsbDsKLQkJaWYgKHJlc291cmNlVHlwZSA9PSBJUmVzb3VyY2UuRk9MREVSKQotCQl7Ci0JCQlEaXJlY3RvcnlEaWFsb2cgZGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyhnZXRTaGVsbCgpKTsKLQkJCWRpYWxvZy5zZXRNZXNzYWdlKGdldE1lc3NhZ2UoRElSRUNUT1JZX0RJQUxPR19NRVNTQUdFKSk7Ci0JCQlpZiAoIWN1cnJlbnRXb3JraW5nRGlyLnRyaW0oKS5lcXVhbHMoIiIpKQotCQkJewotCQkJCUZpbGUgcGF0aCA9IG5ldyBGaWxlKGN1cnJlbnRXb3JraW5nRGlyKTsKLQkJCQlpZiAocGF0aC5leGlzdHMoKSkKLQkJCQl7Ci0JCQkJCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKGN1cnJlbnRXb3JraW5nRGlyKTsKLQkJCQl9Ci0JCQl9Ci0JCQlzZWxlY3RlZCA9IGRpYWxvZy5vcGVuKCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKGdldFNoZWxsKCkpOwotCQkJaWYgKCFjdXJyZW50V29ya2luZ0Rpci50cmltKCkuZXF1YWxzKCIiKSkKLQkJCXsKLQkJCQlGaWxlIHBhdGggPSBuZXcgRmlsZShjdXJyZW50V29ya2luZ0Rpcik7Ci0JCQkJaWYgKHBhdGguZXhpc3RzKCkpCi0JCQkJewotCQkJCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChjdXJyZW50V29ya2luZ0Rpcik7Ci0JCQkJfQotCQkJfQotCQkJU3RyaW5nW10gZmlsZUV4dGVuc2lvbnMgPSBnZXRGaWxlRXh0ZW5zaW9ucygpOwotCQkJaWYgKGZpbGVFeHRlbnNpb25zICE9IG51bGwpCi0JCQl7Ci0JCQkJU3RyaW5nW10gZmlsdGVyRXh0ZW5zaW9ucyA9IG5ldyBTdHJpbmdbZmlsZUV4dGVuc2lvbnMubGVuZ3RoXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVFeHRlbnNpb25zLmxlbmd0aDsgaSsrKQotCQkJCXsKLQkJCQkJU3RyaW5nIGV4dCA9IGZpbGVFeHRlbnNpb25zW2ldOwotCQkJCQlmaWx0ZXJFeHRlbnNpb25zW2ldID0gIiouIiArIGV4dDsKLQkJCQl9Ci0JCQkJZGlhbG9nLnNldEZpbHRlckV4dGVuc2lvbnMoZmlsdGVyRXh0ZW5zaW9ucyk7Ci0JCQl9Ci0JCQlzZWxlY3RlZCA9IGRpYWxvZy5vcGVuKCk7Ci0JCX0KLQkJaWYgKHNlbGVjdGVkICE9IG51bGwpCi0JCXsKLQkJCXJlc291cmNlVGV4dC5zZXRUZXh0KHNlbGVjdGVkKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRGaWxlRXh0ZW5zaW9ucygpCi0JewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVXb3Jrc3BhY2VSZXNvdXJjZUJyb3dzZUJ1dHRvblNlbGVjdGVkKCkKLQl7Ci0JCUlQYXRoIHBhdGggPSBvcGVuV29ya3NwYWNlUmVzb3VyY2VEaWFsb2coKTsKLQkJaWYgKHBhdGggIT0gbnVsbCkKLQkJCXNldFRleHQoIiR7d29ya3NwYWNlX2xvYzoiICsgcGF0aC50b1N0cmluZygpICsgIn0iKTsgIAotCX0KLQotCXByb3RlY3RlZCBJUGF0aCBvcGVuV29ya3NwYWNlUmVzb3VyY2VEaWFsb2coKQotCXsKLQkJSVJlc291cmNlIGN1cnJlbnRSZXNvdXJjZSA9IGdldFJlc291cmNlKCk7Ci0JCUVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9IG5ldyBFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZyhnZXRTaGVsbCgpLCBuZXcgV29ya2JlbmNoTGFiZWxQcm92aWRlcigpLCBuZXcgV29ya2JlbmNoQ29udGVudFByb3ZpZGVyKCkpOwotCQlkaWFsb2cuc2V0VGl0bGUoZ2V0TWVzc2FnZShXT1JLU1BBQ0VfRElBTE9HX1RJVExFKSk7Ci0JCWRpYWxvZy5zZXRNZXNzYWdlKGdldE1lc3NhZ2UoV09SS1NQQUNFX0RJQUxPR19NRVNTQUdFKSk7Ci0JCWRpYWxvZy5zZXRWYWxpZGF0b3IodmFsaWRhdG9yKTsKLQkJZGlhbG9nLmFkZEZpbHRlcihuZXcgVmlld2VyRmlsdGVyKCkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudEVsZW1lbnQsIE9iamVjdCBlbGVtZW50KQotCQkJewotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUNvbnRhaW5lcikKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJaWYgKHJlc291cmNlVHlwZSAhPSBJUmVzb3VyY2UuRklMRSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIGVsZW1lbnQ7Ci0JCQkJU3RyaW5nW10gZXh0ZW5zaW9ucyA9IGdldEZpbGVFeHRlbnNpb25zKCk7Ci0JCQkJaWYgKGV4dGVuc2lvbnMgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJU3RyaW5nIGZpbGVFeHQgPSBmaWxlLmdldEZpbGVFeHRlbnNpb24oKTsKLQkJCQlpZiAoZmlsZUV4dCAhPSBudWxsKQotCQkJCXsKLQkJCQkJZm9yIChTdHJpbmcgZXh0IDogZXh0ZW5zaW9ucykKLQkJCQkJewotCQkJCQkJaWYgKGZpbGVFeHQuZXF1YWxzSWdub3JlQ2FzZShleHQpKQotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfSk7Ci0JCVZpZXdlckZpbHRlciBmaWx0ZXIgPSBnZXRSZXNvdXJjZUZpbHRlcigpOwotCQlpZiAoZmlsdGVyICE9IG51bGwpCi0JCQlkaWFsb2cuYWRkRmlsdGVyKGZpbHRlcik7Ci0JCWRpYWxvZy5zZXRJbnB1dChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLQkJZGlhbG9nLnNldEluaXRpYWxTZWxlY3Rpb24oY3VycmVudFJlc291cmNlKTsKLQkJZGlhbG9nLnNldENvbXBhcmF0b3IobmV3IFJlc291cmNlQ29tcGFyYXRvcihSZXNvdXJjZUNvbXBhcmF0b3IuTkFNRSkpOwotCQlkaWFsb2cuc2V0QWxsb3dNdWx0aXBsZShmYWxzZSk7Ci0KLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKQotCQl7Ci0JCQlPYmplY3RbXSBlbGVtZW50cyA9IGRpYWxvZy5nZXRSZXN1bHQoKTsKLQkJCWlmIChlbGVtZW50cy5sZW5ndGggPiAwKQotCQkJCXJldHVybiAoKElSZXNvdXJjZSkgZWxlbWVudHNbMF0pLmdldEZ1bGxQYXRoKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIFZpZXdlckZpbHRlciBnZXRSZXNvdXJjZUZpbHRlcigpCi0JewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZWxlY3RlZCB3b3Jrc3BhY2UgY29udGFpbmVyLG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHJvdGVjdGVkIElSZXNvdXJjZSBnZXRSZXNvdXJjZSgpCi0JewotCQlTdHJpbmcgcGF0aCA9IGdldFRleHQoKTsKLQkJaWYgKHBhdGgubGVuZ3RoKCkgPiAwKQotCQl7Ci0JCQlJUmVzb3VyY2UgcmVzID0gbnVsbDsKLQkJCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQkJaWYgKHBhdGguc3RhcnRzV2l0aCgiJHt3b3Jrc3BhY2VfbG9jOiIpKSAKLQkJCXsKLQkJCQlJU3RyaW5nVmFyaWFibGVNYW5hZ2VyIG1hbmFnZXIgPSBWYXJpYWJsZXNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0cmluZ1ZhcmlhYmxlTWFuYWdlcigpOwotCQkJCXRyeQotCQkJCXsKLQkJCQkJcGF0aCA9IG1hbmFnZXIucGVyZm9ybVN0cmluZ1N1YnN0aXR1dGlvbihwYXRoLCBmYWxzZSk7Ci0JCQkJCWlmIChyZXNvdXJjZVR5cGUgPT0gSVJlc291cmNlLkZPTERFUikKLQkJCQkJewotCQkJCQkJSUNvbnRhaW5lcltdIGNvbnRhaW5lcnMgPSByb290LmZpbmRDb250YWluZXJzRm9yTG9jYXRpb24obmV3IFBhdGgocGF0aCkpOwotCQkJCQkJaWYgKGNvbnRhaW5lcnMubGVuZ3RoID4gMCkKLQkJCQkJCXsKLQkJCQkJCQlyZXMgPSBjb250YWluZXJzWzBdOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHJlc291cmNlVHlwZSA9PSBJUmVzb3VyY2UuRklMRSkKLQkJCQkJewotCQkJCQkJSUZpbGVbXSBmaWxlcyA9IHJvb3QuZmluZEZpbGVzRm9yTG9jYXRpb24obmV3IFBhdGgocGF0aCkpOwotCQkJCQkJaWYgKGZpbGVzLmxlbmd0aCA+IDApCi0JCQkJCQl7Ci0JCQkJCQkJcmVzID0gZmlsZXNbMF07Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLQkJCQl7Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXJlcyA9IHJvb3QuZmluZE1lbWJlcihwYXRoKTsKLQkJCX0KLQkJCXJldHVybiByZXM7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUmVzb3VyY2VWYXJpYWJsZXNCdXR0b25TZWxlY3RlZCgpCi0JewotCQlTdHJpbmdWYXJpYWJsZVNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBuZXcgU3RyaW5nVmFyaWFibGVTZWxlY3Rpb25EaWFsb2coZ2V0U2hlbGwoKSk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JCVN0cmluZyB2YXJpYWJsZVRleHQgPSBkaWFsb2cuZ2V0VmFyaWFibGVFeHByZXNzaW9uKCk7Ci0JCWlmICh2YXJpYWJsZVRleHQgIT0gbnVsbCkKLQkJewotCQkJcmVzb3VyY2VUZXh0Lmluc2VydCh2YXJpYWJsZVRleHQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc2V0RGVmYXVsdFJlc291cmNlKCk7Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZykKLQl7Ci0JCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJc2V0TWVzc2FnZShudWxsKTsKLQkJLy8gaWYgdmFyaWFibGVzIGFyZSBwcmVzZW50LCB3ZSBjYW5ub3QgcmVzb2x2ZSB0aGUgZGlyZWN0b3J5Ci0JCVN0cmluZyB3b3JraW5nRGlyUGF0aCA9IGdldFRleHQoKTsKLQkJaWYgKHdvcmtpbmdEaXJQYXRoLmluZGV4T2YoIiR7IikgPj0gMCkKLQkJewotCQkJSVN0cmluZ1ZhcmlhYmxlTWFuYWdlciBtYW5hZ2VyID0gVmFyaWFibGVzUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTdHJpbmdWYXJpYWJsZU1hbmFnZXIoKTsKLQkJCXRyeQotCQkJewotCQkJCW1hbmFnZXIudmFsaWRhdGVTdHJpbmdWYXJpYWJsZXMod29ya2luZ0RpclBhdGgpOwotCQkJCWlmIChtdXN0RXhpc3QpCi0JCQkJewotCQkJCQlTdHJpbmcgcGF0aCA9IG1hbmFnZXIucGVyZm9ybVN0cmluZ1N1YnN0aXR1dGlvbih3b3JraW5nRGlyUGF0aCk7Ci0JCQkJCXZhbGlkYXRlUmVzb3VyY2UocGF0aCk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLQkJCXsKLQkJCQlzZXRFcnJvck1lc3NhZ2UoZS5nZXRNZXNzYWdlKCkpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChtdXN0RXhpc3QgJiYgd29ya2luZ0RpclBhdGgubGVuZ3RoKCkgPiAwKQotCQl7Ci0JCQlyZXR1cm4gdmFsaWRhdGVSZXNvdXJjZSh3b3JraW5nRGlyUGF0aCk7Ci0JCX0KLQkJZWxzZSBpZiAocmVxdWlyZWQgJiYgd29ya2luZ0RpclBhdGgubGVuZ3RoKCkgPT0gMCkKLQkJewotCQkJc2V0RXJyb3JNZXNzYWdlKGdldE1lc3NhZ2UoRVJST1JfRElSRUNUT1JZX05PVF9TUEVDSUZJRUQpKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVJlc291cmNlKFN0cmluZyB3b3JraW5nRGlyUGF0aCkKLQl7Ci0JCWlmIChyZXNvdXJjZVR5cGUgPT0gSVJlc291cmNlLkZPTERFUikKLQkJewotCQkJSUNvbnRhaW5lciBjb250YWluZXIgPSAoSUNvbnRhaW5lcikgZ2V0UmVzb3VyY2UoKTsKLQkJCWlmIChjb250YWluZXIgPT0gbnVsbCkKLQkJCXsKLQkJCQlGaWxlIGRpciA9IG5ldyBGaWxlKHdvcmtpbmdEaXJQYXRoKTsKLQkJCQlpZiAoZGlyLmlzRGlyZWN0b3J5KCkpCi0JCQkJewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZWxzZSBpZiAocmVzb3VyY2VUeXBlID09IElSZXNvdXJjZS5GSUxFKQotCQl7Ci0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZSh3b3JraW5nRGlyUGF0aCk7Ci0JCQlpZiAoZmlsZS5pc0ZpbGUoKSkKLQkJCXsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlzZXRFcnJvck1lc3NhZ2UoZ2V0TWVzc2FnZShFUlJPUl9ESVJFQ1RPUllfRE9FU19OT1RfRVhJU1QpKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0TWVzc2FnZShpbnQgdHlwZSk7Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0ZXh0TW9kaWZpZWQoKQotCXsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRleHQoKQotCXsKLQkJcmV0dXJuIHJlc291cmNlVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpCi0JewotCQlyZXNvdXJjZVRleHQuc2V0VGV4dCh0ZXh0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYXVuY2hDb25maWd1cmF0aW9uKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZykKLQl7Ci0JCWZMYXVuY2hDb25maWd1cmF0aW9uID0gY29uZmlnOwotCX0KLQotCXByb3RlY3RlZCBJTGF1bmNoQ29uZmlndXJhdGlvbiBnZXRMYXVuY2hDb25maWd1cmF0aW9uKCkKLQl7Ci0JCXJldHVybiBmTGF1bmNoQ29uZmlndXJhdGlvbjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL1hTTENvbnNvbGVMaW5lVHJhY2tlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL1hTTENvbnNvbGVMaW5lVHJhY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzcwNzk0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9YU0xDb25zb2xlTGluZVRyYWNrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgT3Jhbmdldm9sdCAod3d3Lm9yYW5nZXZvbHQuY29tKQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgTGFycyBHZXJzbWFubiAod3d3Lm9yYW5nZXZvbHQuY29tKSAKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWspIAotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aTsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5jb25zb2xlLklDb25zb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLmNvbnNvbGUuSUNvbnNvbGVMaW5lVHJhY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QucHJvZ3JhbS5Qcm9ncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY29uc29sZS5JSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLQotLyoqCi0gKiA8cD4KLSAqIEEgY29uc29sZSBsaW5lIHRyYWNrZXIgZm9yIFhTTCBsYXVuY2hlcy4KLSAqIDwvcD4KLSAqIAotICogPHA+Ci0gKiBOb3RlOiBJdCBpcyBhY3R1YWxseSBjb25maWd1cmVkIHRvIHJ1biBmb3IgYWxsIEphdmEgbGF1bmNoZXMgaW4KLSAqIDxjb2RlPnBsdWdpbi54bWw8L2NvZGU+LCBidXQgaXQgb25seSByZWFsbHkgYmVjb21lcyBlbmFibGVkIHdoZW4gdGhlCi0gKiBsYXVuY2ggY29uZmlndXJhdGlvbiB0eXBlIGlzCi0gKiA8Y29kZT5vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5sYXVuY2hDb25maWd1cmF0aW9uVHlwZTwvY29kZT4uCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBYU0xDb25zb2xlTGluZVRyYWNrZXIgaW1wbGVtZW50cyBJQ29uc29sZUxpbmVUcmFja2VyCi17Ci0JcHJpdmF0ZSBJQ29uc29sZSBjb25zb2xlOwotCXByaXZhdGUgYm9vbGVhbiBlbmFibGVkOwotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpCi0JewotCQljb25zb2xlID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElDb25zb2xlIGNvbnNvbGUpCi0JewotCQl0aGlzLmNvbnNvbGUgPSBjb25zb2xlOwotCQl0aGlzLmVuYWJsZWQgPSBmYWxzZTsKLQkJdHJ5Ci0JCXsKLQkJCVN0cmluZyBsYXVuY2hUeXBlSWQgPSBjb25zb2xlLmdldFByb2Nlc3MoKS5nZXRMYXVuY2goKS5nZXRMYXVuY2hDb25maWd1cmF0aW9uKCkuZ2V0VHlwZSgpLmdldElkZW50aWZpZXIoKTsKLQkJCXRoaXMuZW5hYmxlZCA9ICJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5sYXVuY2hDb25maWd1cmF0aW9uVHlwZSIuZXF1YWxzKGxhdW5jaFR5cGVJZCk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLQkJewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbGluZUFwcGVuZGVkKElSZWdpb24gbGluZSkKLQl7Ci0JCWlmICghZW5hYmxlZCkKLQkJCXJldHVybjsKLQotCQlpbnQgbGluZU9mZnNldCA9IGxpbmUuZ2V0T2Zmc2V0KCk7Ci0JCWludCBsaW5lTGVuZ3RoID0gbGluZS5nZXRMZW5ndGgoKTsKLQkJdHJ5Ci0JCXsKLQkJCVN0cmluZyB0ZXh0ID0gY29uc29sZS5nZXREb2N1bWVudCgpLmdldChsaW5lT2Zmc2V0LCBsaW5lTGVuZ3RoKTsKLQkJCWludCBpOwotCQkJaWYgKChpID0gdGV4dC5pbmRleE9mKCJmaWxlOi8iKSkgIT0gLTEgfHwgKGkgPSB0ZXh0LmluZGV4T2YoImh0dHA6Ly8iKSkgIT0gLTEgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCXx8IChpID0gdGV4dC5pbmRleE9mKCJodHRwczovLyIpKSAhPSAtMSB8fCAoaSA9IHRleHQuaW5kZXhPZigiZnRwOi8vIikpICE9IC0xKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXsKLQkJCQlpbnQgdiA9IGkgKyA5OwotCQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIodGV4dC5zdWJzdHJpbmcoaSwgdikpOwotCQkJCWZvciAoOyB2IDwgdGV4dC5sZW5ndGgoKTsgdisrKQotCQkJCXsKLQkJCQkJY2hhciBjID0gdGV4dC5jaGFyQXQodik7Ci0JCQkJCWlmIChjICE9ICcgJyAmJiBjICE9ICc6JyAmJiBjICE9ICc7JyAmJiBjICE9ICd7JyAmJiBjICE9ICd9JyAmJiBjICE9ICdbJyAmJiBjICE9ICddJyAmJiBjICE9ICcoJyAmJiBjICE9ICcpJykKLQkJCQkJewotCQkJCQkJc2IuYXBwZW5kKGMpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlFeHRlcm5hbEZpbGVDb25zb2xlSHlwZXJMaW5rIGxpbmsgPSBuZXcgRXh0ZXJuYWxGaWxlQ29uc29sZUh5cGVyTGluayhzYi50b1N0cmluZygpLCAtMSk7Ci0JCQkJY29uc29sZS5hZGRMaW5rKGxpbmssIGxpbmVPZmZzZXQgKyBpLCB2IC0gaSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpCi0JCXsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEV4dGVybmFsRmlsZUNvbnNvbGVIeXBlckxpbmsgaW1wbGVtZW50cyBJSHlwZXJsaW5rCi0JewotCQlwcml2YXRlIGZpbmFsIGludCBmTGluZU51bWJlcjsKLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdXJpOwotCi0JCXB1YmxpYyBFeHRlcm5hbEZpbGVDb25zb2xlSHlwZXJMaW5rKFN0cmluZyB1cmksIGludCBsaW5lTnVtYmVyKQotCQl7Ci0JCQl0aGlzLmZMaW5lTnVtYmVyID0gbGluZU51bWJlcjsKLQkJCXRoaXMudXJpID0gdXJpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5jb25zb2xlLklDb25zb2xlSHlwZXJsaW5rI2xpbmtFbnRlcmVkKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGxpbmtFbnRlcmVkKCkKLQkJewotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5jb25zb2xlLklDb25zb2xlSHlwZXJsaW5rI2xpbmtFeGl0ZWQoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbGlua0V4aXRlZCgpCi0JCXsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuY29uc29sZS5JQ29uc29sZUh5cGVybGluayNsaW5rQWN0aXZhdGVkKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoKQotCQl7Ci0JCQlVUkwgdXJsID0gbnVsbDsKLQkJCXRyeQotCQkJewotCQkJCXVybCA9IG5ldyBVUkwodXJpKTsKLQkJCX0KLQkJCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLQkJCXsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAoImZpbGUiLmVxdWFscyh1cmwuZ2V0UHJvdG9jb2woKSkpCi0JCQl7Ci0JCQkJU3RyaW5nIHBhdGggPSBVUkxEZWNvZGVyLmRlY29kZSh1cmwuZ2V0UGF0aCgpKTsKLQkJCQlQYXRoIGZFeHRlcm5hbFBhdGggPSBuZXcgUGF0aChwYXRoKTsKLQkJCQlJRmlsZVtdIGZpbGVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kRmlsZXNGb3JMb2NhdGlvbihmRXh0ZXJuYWxQYXRoKTsKLQkJCQlpZiAoZmlsZXMubGVuZ3RoID4gMCkKLQkJCQl7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspCi0JCQkJCXsKLQkJCQkJCUlGaWxlIGN1cnIgPSBmaWxlc1swXTsKLQkJCQkJCUlFZGl0b3JQYXJ0IHBhcnQ7Ci0JCQkJCQl0cnkKLQkJCQkJCXsKLQkJCQkJCQlwYXJ0ID0gSURFLm9wZW5FZGl0b3IoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCksIGN1cnIpOwotCQkJCQkJCWlmIChwYXJ0ICE9IG51bGwgJiYgZkxpbmVOdW1iZXIgIT0gLTEpCi0JCQkJCQkJewotCQkJCQkJCQlpZiAocGFydCBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKQotCQkJCQkJCQl7Ci0JCQkJCQkJCQl0cnkKLQkJCQkJCQkJCXsKLQkJCQkJCQkJCQlyZXZlYWxMaW5lKChJVGV4dEVkaXRvcikgcGFydCwgZkxpbmVOdW1iZXIpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpCi0JCQkJCQkJCQl7Ci0JCQkJCQkJCQkJLy8gaWdub3JlCi0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKQotCQkJCQkJewotCQkJCQkJCS8vIGlnbm9yZQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCVByb2dyYW0ubGF1bmNoKHVybC50b0V4dGVybmFsRm9ybSgpKTsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCByZXZlYWxMaW5lKElUZXh0RWRpdG9yIGVkaXRvciwgaW50IGxpbmVOdW1iZXIpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbgotCQl7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBlZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJCUlSZWdpb24gcmVnaW9uID0gZG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uKGxpbmVOdW1iZXIgLSAxKTsKLQkJCWVkaXRvci5zZWxlY3RBbmRSZXZlYWwocmVnaW9uLmdldE9mZnNldCgpLCAwKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9YU0xEZWJ1Z1VJQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvWFNMRGVidWdVSUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDMxNGEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9YU0xEZWJ1Z1VJQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpOwotCi0KLXB1YmxpYyBjbGFzcyBYU0xEZWJ1Z1VJQ29uc3RhbnRzCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWCA9IFhTTERlYnVnVUlQbHVnaW4uUExVR0lOX0lEICsgJy4nOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0NFU1NPUl9ERVRBSUxTX0RJQUxPRyA9IFBSRUZJWCArICJQUk9DRVNTT1JfREVUQUlMU19ESUFMT0ciOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0NFU1NPUl9PVVRQVVRfUFJPUEVSVElFU19CTE9DSyA9IFBSRUZJWCArICJQUk9DRVNTT1JfT1VUUFVUX1BST1BFUlRJRVNfQkxPQ0siOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BSU5fUEFSQU1BVEVSU19CTE9DSyA9IFBSRUZJWCArICJNQUlOX1BBUkFNQVRFUlNfQkxPQ0siOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BSU5fVFJBTlNGT1JNU19CTE9DSyA9IFBSRUZJWCArICJNQUlOX1RSQU5TRk9STVNfQkxPQ0siOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVTX0JMT0NLID0gUFJFRklYICsgIkZFQVRVUkVTX0JMT0NLIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPVVRQVVRfQkxPQ0sgPSBQUkVGSVggKyAiT1VUUFVUX0JMT0NLIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFU19MQVVOQ0hfQkxPQ0sgPSBQUkVGSVggKyAiRkVBVFVSRVNfTEFVTkNIX0JMT0NLIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTTF9FRElUT1JfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWUuWE1MTXVsdGlQYWdlRWRpdG9yUGFydCI7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvWFNMRGVidWdVSVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL1hTTERlYnVnVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdkOGJkNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvWFNMRGVidWdVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICovCi1wdWJsaWMgY2xhc3MgWFNMRGVidWdVSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4KLXsKLQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkiOwotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIFhTTERlYnVnVUlQbHVnaW4gcGx1Z2luOwotCi0JcHVibGljIFhTTERlYnVnVUlQbHVnaW4oKQotCXsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24KLQl7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uCi0JewotCQlwbHVnaW4gPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgWFNMRGVidWdVSVBsdWdpbiBnZXREZWZhdWx0KCkKLQl7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBwYXRoKQotCXsKLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oUExVR0lOX0lELCBwYXRoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2hvd1ByZWZlcmVuY2VQYWdlKFN0cmluZyBpZCwgSVByZWZlcmVuY2VQYWdlIHBhZ2UpCi0JewotCQlmaW5hbCBJUHJlZmVyZW5jZU5vZGUgdGFyZ2V0Tm9kZSA9IG5ldyBQcmVmZXJlbmNlTm9kZShpZCwgcGFnZSk7Ci0KLQkJUHJlZmVyZW5jZU1hbmFnZXIgbWFuYWdlciA9IG5ldyBQcmVmZXJlbmNlTWFuYWdlcigpOwotCQltYW5hZ2VyLmFkZFRvUm9vdCh0YXJnZXROb2RlKTsKLQkJZmluYWwgUHJlZmVyZW5jZURpYWxvZyBkaWFsb2cgPSBuZXcgUHJlZmVyZW5jZURpYWxvZyhYU0xEZWJ1Z1VJUGx1Z2luLmdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksIG1hbmFnZXIpOwotCQlmaW5hbCBib29sZWFuW10gcmVzdWx0ID0gbmV3IGJvb2xlYW5bXQotCQl7IGZhbHNlIH07Ci0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKFhTTERlYnVnVUlQbHVnaW4uZ2V0U3RhbmRhcmREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpCi0JCXsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpCi0JCQl7Ci0JCQkJZGlhbG9nLmNyZWF0ZSgpOwotCQkJCWRpYWxvZy5zZXRNZXNzYWdlKHRhcmdldE5vZGUuZ2V0TGFiZWxUZXh0KCkpOwotCQkJCXJlc3VsdFswXSA9IChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSyk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRGlzcGxheSBnZXRTdGFuZGFyZERpc3BsYXkoKQotCXsKLQkJRGlzcGxheSBkaXNwbGF5OwotCQlkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCWlmIChkaXNwbGF5ID09IG51bGwpCi0JCQlkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCXJldHVybiBkaXNwbGF5OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVdvcmtiZW5jaFdpbmRvdyBnZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCXsKLQkJcmV0dXJuIGdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFNoZWxsIGdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCkKLQl7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmICh3aW5kb3cgIT0gbnVsbCkKLQkJewotCQkJcmV0dXJuIHdpbmRvdy5nZXRTaGVsbCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVdvcmtiZW5jaFBhZ2UgZ2V0QWN0aXZlUGFnZSgpCi0JewotCQlJV29ya2JlbmNoV2luZG93IHcgPSBnZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJaWYgKHcgIT0gbnVsbCkKLQkJewotCQkJcmV0dXJuIHcuZ2V0QWN0aXZlUGFnZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coRXhjZXB0aW9uIGUpCi0JewotCQlnZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCAwLCAiIiwgZSkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coQ29yZUV4Y2VwdGlvbiBlKQotCXsKLQkJZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhlLmdldFN0YXR1cygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvWFNMTGF1bmNoQ29uZmlndXJhdGlvblRhYi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL1hTTExhdW5jaENvbmZpZ3VyYXRpb25UYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ0YTQxYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvWFNMTGF1bmNoQ29uZmlndXJhdGlvblRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5BYnN0cmFjdExhdW5jaENvbmZpZ3VyYXRpb25UYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgWFNMTGF1bmNoQ29uZmlndXJhdGlvblRhYiBleHRlbmRzIEFic3RyYWN0TGF1bmNoQ29uZmlndXJhdGlvblRhYgotewotCXByaXZhdGUgSUxhdW5jaENvbmZpZ3VyYXRpb25UYWJbXSBibG9ja3M7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRCbG9ja3MoSUxhdW5jaENvbmZpZ3VyYXRpb25UYWJbXSBibG9ja3MpCi0JewotCQl0aGlzLmJsb2NrcyA9IGJsb2NrczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpCi0JewotCQlDb21wb3NpdGUgY29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbXAuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJLy8gVE9ETyBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGdldENvbnRyb2woKSwKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCWNvbXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXNldENvbnRyb2woY29tcCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdHMoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uKQotCXsKLQkJZm9yIChJTGF1bmNoQ29uZmlndXJhdGlvblRhYiBlbGVtZW50IDogYmxvY2tzKQotCQkJZWxlbWVudC5zZXREZWZhdWx0cyhjb25maWd1cmF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKQotCXsKLQkJZm9yIChJTGF1bmNoQ29uZmlndXJhdGlvblRhYiBlbGVtZW50IDogYmxvY2tzKQotCQkJZWxlbWVudC5pbml0aWFsaXplRnJvbShjb25maWd1cmF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtQXBwbHkoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uKQotCXsKLQkJZm9yIChJTGF1bmNoQ29uZmlndXJhdGlvblRhYiBlbGVtZW50IDogYmxvY2tzKQotCQkJZWxlbWVudC5wZXJmb3JtQXBwbHkoY29uZmlndXJhdGlvbik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0TGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZyhJTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZyBkaWFsb2cpCi0JewotCQlzdXBlci5zZXRMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKGRpYWxvZyk7Ci0JCWZvciAoSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIgZWxlbWVudCA6IGJsb2NrcykKLQkJCWVsZW1lbnQuc2V0TGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZyhkaWFsb2cpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotCXsKLQkJZm9yIChJTGF1bmNoQ29uZmlndXJhdGlvblRhYiBlbGVtZW50IDogYmxvY2tzKQotCQkJZWxlbWVudC5kaXNwb3NlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWN0aXZhdGVkKElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgd29ya2luZ0NvcHkpCi0JewotCQkvLyBkb24ndCBjYWxsIGluaXRpYWxpemVGcm9tCi0JCS8vIHN1cGVyLmFjdGl2YXRlZCh3b3JraW5nQ29weSk7Ci0JCWZvciAoSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIgZWxlbWVudCA6IGJsb2NrcykKLQkJCWVsZW1lbnQuYWN0aXZhdGVkKHdvcmtpbmdDb3B5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pCi0JewotCQlib29sZWFuIHZhbGlkID0gdHJ1ZTsKLQkJZm9yIChJTGF1bmNoQ29uZmlndXJhdGlvblRhYiBlbGVtZW50IDogYmxvY2tzKQotCQkJdmFsaWQgJj0gZWxlbWVudC5pc1ZhbGlkKGNvbmZpZ3VyYXRpb24pOwotCQlyZXR1cm4gdmFsaWQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKQotCXsKLQkJU3RyaW5nIG0gPSBzdXBlci5nZXRFcnJvck1lc3NhZ2UoKTsKLQkJaWYgKG0gPT0gbnVsbCkKLQkJewotCQkJZm9yIChJTGF1bmNoQ29uZmlndXJhdGlvblRhYiBlbGVtZW50IDogYmxvY2tzKQotCQkJewotCQkJCW0gPSBlbGVtZW50LmdldEVycm9yTWVzc2FnZSgpOwotCQkJCWlmIChtICE9IG51bGwpCi0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBtOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpCi0JewotCQlTdHJpbmcgbSA9IHN1cGVyLmdldE1lc3NhZ2UoKTsKLQkJaWYgKG0gPT0gbnVsbCkKLQkJewotCQkJZm9yIChJTGF1bmNoQ29uZmlndXJhdGlvblRhYiBlbGVtZW50IDogYmxvY2tzKQotCQkJewotCQkJCW0gPSBlbGVtZW50LmdldE1lc3NhZ2UoKTsKLQkJCQlpZiAobSAhPSBudWxsKQotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9YU0xMYXVuY2hTaG9ydGN1dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL1hTTExhdW5jaFNob3J0Y3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3ZmNmOTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL1hTTExhdW5jaFNob3J0Y3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnZhcmlhYmxlcy5WYXJpYWJsZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLkRlYnVnVUlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JRGVidWdNb2RlbFByZXNlbnRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoU2hvcnRjdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuU3RhdHVzRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRWxlbWVudExpc3RTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLm1haW4uSW5wdXRGaWxlQmxvY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5YU0xUUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5jb25maWcuTGF1bmNoSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmNvbmZpZy5MYXVuY2hQaXBlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5jb25maWcuTGF1bmNoVHJhbnNmb3JtOwotCi0vKioKLSAqIDx0YWJsZSBib3JkZXI9MT4KLSAqIAk8dGg+Ci0gKiAJCTx0cj4KLSAqIAkJCTx0ZD5YTUwgRmlsZXM8L3RkPgotICogIAkJPHRkPlhTTCBGaWxlczwvdGQ+CQkJCi0gKiAJCQk8dGQ+QWN0aW9uPC90ZD4KLSAqIAkJPC90cj4KLSAqICA8L3RoPgotICogIDx0Ym9keT4KLSAqICAJPHRyPgotICogCQkJPHRkPjE8L3RkPgotICogCQkJPHRkPjA8L3RkPgotICogCQkJPHRkPkxhdW5jaCBhc3N1bWluZyBlbWJlZGRlZCBzdHlsZXNoZWV0IGluc3RydWN0aW9uPC90ZD4KLSAqICAJPC90cj4KLSAqICAJPHRyPgotICogCQkJPHRkPjA8L3RkPgotICogCQkJPHRkPiZndDs9MTwvdGQ+Ci0gKiAJCQk8dGQ+T3BlbiBkaWFsb2cgLSBwcm9tcHQgZm9yIGlucHV0IGZpbGU8L3RkPgotICogIAk8L3RyPgotICogIAk8dHI+Ci0gKiAJCQk8dGQ+MTwvdGQ+Ci0gKiAJCQk8dGQ+Jmd0Oz0xPC90ZD4KLSAqIAkJCTx0ZD5MYXVuY2g8L3RkPgotICogIAk8L3RyPgotICogIDwvdGJvZHk+Ci0gKiA8L3RhYmxlPgotICogCi0gKiA8cD5UaGUgbGF1bmNoIHNob3J0Y3V0IHNob3VsZCBub3QgYXBwZWFyIGluIHRoZSBtZW51IGZvciBhbnkgb3RoZXIgY29tYmluYXRpb24gb2YgZmlsZXM8L3A+Ci0gKiA8cD5JbiBhbGwgY2FzZXMsIGEgY2hlY2sgbXVzdCBiZSBwZXJmb3JtZWQgdG8gZmluZCBhbnkgZXhpc3RpbmcgbGF1bmNoIGNvbmZpZ3VyYXRpb24gdGhhdCB1c2VzIHRoZSBzZWxlY3RlZCBmaWxlcy48L3A+Ci0gKiAKLSAqIEBhdXRob3IgRG91ZwotICovCi1wdWJsaWMgY2xhc3MgWFNMTGF1bmNoU2hvcnRjdXQgaW1wbGVtZW50cyBJTGF1bmNoU2hvcnRjdXQKLXsKLQlwcml2YXRlIElGaWxlIHhtbEZpbGU7Ci0JcHJpdmF0ZSBJUGF0aCB4bWxGaWxlUGF0aDsKLQlwcml2YXRlIElGaWxlW10geHNsRmlsZXM7Ci0JCi0JcHVibGljIHZvaWQgbGF1bmNoKElTZWxlY3Rpb24gc2VsZWN0aW9uLCBTdHJpbmcgbW9kZSkKLQl7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkJewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3NlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0JCQlzZWFyY2hBbmRMYXVuY2goc3NlbC50b0FycmF5KCksbW9kZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBsYXVuY2goSUVkaXRvclBhcnQgZWRpdG9yLCBTdHJpbmcgbW9kZSkKLQl7Ci0gICAgICAgIElFZGl0b3JJbnB1dCBpbnB1dCA9IGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotCQlpZiAoaW5wdXQgIT0gbnVsbCkKLQkJewotCQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgaW5wdXQuZ2V0QWRhcHRlcihJRmlsZS5jbGFzcyk7Ci0JCQlpZiAoZmlsZSAhPSBudWxsKQotCQkJCXNlYXJjaEFuZExhdW5jaChuZXcgT2JqZWN0W117IGZpbGUgfSwgbW9kZSk7Ci0JCX0gCi0JfQotCQotCXByaXZhdGUgdm9pZCBzZWFyY2hBbmRMYXVuY2goT2JqZWN0W10gb2JqZWN0cywgU3RyaW5nIG1vZGUpCi0JewotCQlpZiAoZmlsbEZpbGVzKG9iamVjdHMpKQotCQl7Ci0JCQkvLyBlbnN1cmUgd2UgaGF2ZSBhbiBpbnB1dCBmaWxlCi0JCQlpZiAoeG1sRmlsZSA9PSBudWxsKQotCQkJCXByb21wdEZvcklucHV0KCk7Ci0JCQlpZiAoeG1sRmlsZSAhPSBudWxsIHx8IHhtbEZpbGVQYXRoICE9IG51bGwpCi0JCQkJbGF1bmNoKG1vZGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb21wdEZvcklucHV0KCkKLQl7Ci0JCS8vIHByb21wdCBmb3IgaW5wdXQgeG1sIGZpbGUKLQkJU3RhdHVzRGlhbG9nIGRpYWxvZyA9IG5ldyBTdGF0dXNEaWFsb2coZ2V0U2hlbGwoKSl7Ci0JCQlwcml2YXRlIElucHV0RmlsZUJsb2NrIGlucHV0RmlsZUJsb2NrID0gbmV3IElucHV0RmlsZUJsb2NrKG51bGwpOwotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkKLQkJCXsKLQkJCQlDb21wb3NpdGUgY29tcCA9IChDb21wb3NpdGUpc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQkJCWNvbXAuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKTsKLQkJCQljb21wLnNldExheW91dChsYXlvdXQpOwotCQkJCQotCQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXAsU1dULk5PTkUpOwotCQkJCWxhYmVsLnNldEZvbnQoY29tcC5nZXRGb250KCkpOwotCQkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCQkJZ2QuaG9yaXpvbnRhbEluZGVudCA9IDU7Ci0JCQkJZ2QudmVydGljYWxJbmRlbnQgPSA1OwotCQkJCWdkLndpZHRoSGludCA9IDM4MDsKLQkJCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCQlsYWJlbC5zZXRUZXh0KCJTZWxlY3QgYW4gaW5wdXQgZmlsZSBmb3IgdGhlIHRyYW5zZm9ybWF0aW9uIik7Ci0JCQkJCi0JCQkJaW5wdXRGaWxlQmxvY2suY3JlYXRlQ29udHJvbChjb21wKTsKLQkJCQlyZXR1cm4gY29tcDsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKQotCQkJewotCQkJCUlSZXNvdXJjZSByZXMgPSBpbnB1dEZpbGVCbG9jay5nZXRSZXNvdXJjZSgpOwotCQkJCWlmIChyZXMgPT0gbnVsbCkKLQkJCQkJeG1sRmlsZVBhdGggPSBuZXcgUGF0aChpbnB1dEZpbGVCbG9jay5nZXRUZXh0KCkpOwotCQkJCWVsc2UgaWYgKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZXhpc3RzKHJlcy5nZXRGdWxsUGF0aCgpKSAmJiByZXMuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKQotCQkJCQl4bWxGaWxlID0gKElGaWxlKXJlczsKLQkJCQlzdXBlci5va1ByZXNzZWQoKTsKLQkJCX0KLQkJCQotCQl9OwotCQlkaWFsb2cuc2V0SGVscEF2YWlsYWJsZShmYWxzZSk7Ci0JCWRpYWxvZy5zZXRTdGF0dXNMaW5lQWJvdmVCdXR0b25zKHRydWUpOwotCQlkaWFsb2cuc2V0VGl0bGUoIklucHV0IEZpbGUiKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZmlsbEZpbGVzKE9iamVjdFtdIHNlbGVjdGlvbnMpCi0JewotCQl4bWxGaWxlID0gbnVsbDsKLQkJeG1sRmlsZVBhdGggPSBudWxsOwotCQlMaXN0PElGaWxlPiB4c2xGaWxlTGlzdCA9IG5ldyBBcnJheUxpc3Q8SUZpbGU+KCk7Ci0JCWZvciAoT2JqZWN0IG9iamVjdCA6IHNlbGVjdGlvbnMpCi0JCXsKLQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IChJUmVzb3VyY2Upb2JqZWN0OwotCQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkKLQkJCXsKLQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKXJlc291cmNlOwotCQkJCWlmIChYU0xUUnVudGltZS5pc1hNTEZpbGUoZmlsZSkpCi0JCQkJewotCQkJCQlpZiAoWFNMVFJ1bnRpbWUuaXNYU0xGaWxlKGZpbGUpKQotCQkJCQkJeHNsRmlsZUxpc3QuYWRkKGZpbGUpOwotCQkJCQllbHNlIGlmICh4bWxGaWxlPT1udWxsKQotCQkJCQkJeG1sRmlsZSA9IGZpbGU7Ci0JCQkJCWVsc2UKLQkJCQkJCXJldHVybiBmYWxzZTsgLy8gbm8gYWN0aW9uIGlmIHdlIGhhdmUgbW9yZSB0aGFuIHRoYW4gMSB4bWwgZmlsZQotCQkJCX0KLQkJCX0KLQkJfQotCQl4c2xGaWxlcyA9IHhzbEZpbGVMaXN0LnRvQXJyYXkobmV3IElGaWxlWzBdKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxhdW5jaChTdHJpbmcgbW9kZSkKLQl7Ci0JCWlmICh4bWxGaWxlIT1udWxsKQotCQkJeG1sRmlsZVBhdGggPSB4bWxGaWxlLmdldExvY2F0aW9uKCk7Ci0JCUlMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZyA9IG51bGw7Ci0JCXRyeQotCQl7Ci0JCQljb25maWcgPSBmaW5kT3JDcmVhdGVMYXVuY2hDb25maWd1cmF0aW9uKCk7Ci0JCQlpZiAoY29uZmlnIT1udWxsKQotCQkJCURlYnVnVUlUb29scy5sYXVuY2goY29uZmlnLCBtb2RlKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotCQl7Ci0JCQlYU0xEZWJ1Z1VJUGx1Z2luLmxvZyhlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSUxhdW5jaE1hbmFnZXIgZ2V0TGF1bmNoTWFuYWdlcigpCi0JewotCQlyZXR1cm4gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExhdW5jaE1hbmFnZXIoKTsKLQl9Ci0KLQlwcml2YXRlIElMYXVuY2hDb25maWd1cmF0aW9uVHlwZSBnZXRDb25maWd1cmF0aW9uVHlwZSgpCi0JewotCQlyZXR1cm4gZ2V0TGF1bmNoTWFuYWdlcigpLmdldExhdW5jaENvbmZpZ3VyYXRpb25UeXBlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuSURfTEFVTkNIX0NPTkZJR19UWVBFKTsKLQl9Ci0KLQlwcml2YXRlIElMYXVuY2hDb25maWd1cmF0aW9uIGZpbmRPckNyZWF0ZUxhdW5jaENvbmZpZ3VyYXRpb24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJSUxhdW5jaENvbmZpZ3VyYXRpb25bXSBjb25maWdzID0gZ2V0TGF1bmNoTWFuYWdlcigpLmdldExhdW5jaENvbmZpZ3VyYXRpb25zKGdldENvbmZpZ3VyYXRpb25UeXBlKCkpOwotCQlMaXN0PElMYXVuY2hDb25maWd1cmF0aW9uPiBjYW5kaWRhdGVDb25maWdzID0gbmV3IEFycmF5TGlzdDxJTGF1bmNoQ29uZmlndXJhdGlvbj4oY29uZmlncy5sZW5ndGgpOwotCQlmb3IgKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZyA6IGNvbmZpZ3MpCi0JCXsKLQkJCVN0cmluZyBpbnB1dEZpbGUgPSBjb25maWcuZ2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9JTlBVVF9GSUxFLCAoU3RyaW5nKSBudWxsKTsKLQkJCWlucHV0RmlsZSA9IFZhcmlhYmxlc1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RyaW5nVmFyaWFibGVNYW5hZ2VyKCkucGVyZm9ybVN0cmluZ1N1YnN0aXR1dGlvbihpbnB1dEZpbGUpOwotCQkJUGF0aCBwYXRoID0gbmV3IFBhdGgoaW5wdXRGaWxlKTsKLQkJCS8vIHRoZSBzb3VyY2UgeG1sIGZpbGUgbXVzdCBiZSB0aGUgc2FtZQotCQkJaWYgKHBhdGguZXF1YWxzKHhtbEZpbGVQYXRoKSkKLQkJCXsKLQkJCQlMYXVuY2hIZWxwZXIgbGggPSBuZXcgTGF1bmNoSGVscGVyKGNvbmZpZyk7Ci0JCQkJLy8gYWxsIHRoZSBzZWxlY3RlZCBzdHlsZXNoZWV0cyBtdXN0IGJlIGluIHRoZSBwaXBlbGluZQotCQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCQlmb3IgKElGaWxlIHN0eWxlc2hlZXQgOiB4c2xGaWxlcykKLQkJCQl7Ci0JCQkJCWZvdW5kID0gZmFsc2U7Ci0JCQkJCWZvciAoSXRlcmF0b3I8TGF1bmNoVHJhbnNmb3JtPiBpdGVyID0gbGguZ2V0UGlwZWxpbmUoKS5nZXRUcmFuc2Zvcm1EZWZzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotCQkJCQl7Ci0JCQkJCQlMYXVuY2hUcmFuc2Zvcm0gbHQgPSBpdGVyLm5leHQoKTsKLQkJCQkJCWlmIChsdC5nZXRMb2NhdGlvbigpLmVxdWFscyhzdHlsZXNoZWV0LmdldExvY2F0aW9uKCkpKQotCQkJCQkJewotCQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoIWZvdW5kKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmIChmb3VuZCkKLQkJCQkJY2FuZGlkYXRlQ29uZmlncy5hZGQoY29uZmlnKTsKLQkJCX0KLQkJfQotCi0JCUlMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZyA9IG51bGw7Ci0JCWludCBjYW5kaWRhdGVDb3VudCA9IGNhbmRpZGF0ZUNvbmZpZ3Muc2l6ZSgpOwotCQlpZiAoY2FuZGlkYXRlQ291bnQgPT0gMSkKLQkJCWNvbmZpZyA9IChJTGF1bmNoQ29uZmlndXJhdGlvbiljYW5kaWRhdGVDb25maWdzLmdldCgwKTsKLQkJZWxzZSBpZiAoY2FuZGlkYXRlQ291bnQgPiAxKQotCQkJY29uZmlnID0gY2hvb3NlQ29uZmlndXJhdGlvbihjYW5kaWRhdGVDb25maWdzKTsKLQkJZWxzZQotCQkJY29uZmlnID0gY3JlYXRlQ29uZmlndXJhdGlvbigpOwotCi0JCXJldHVybiBjb25maWc7Ci0JfQotCi0JcHJpdmF0ZSBJTGF1bmNoQ29uZmlndXJhdGlvbiBjaG9vc2VDb25maWd1cmF0aW9uKExpc3Q8SUxhdW5jaENvbmZpZ3VyYXRpb24+IGNvbmZpZ0xpc3QpCi0JewotCQlJRGVidWdNb2RlbFByZXNlbnRhdGlvbiBsYWJlbFByb3ZpZGVyID0gRGVidWdVSVRvb2xzLm5ld0RlYnVnTW9kZWxQcmVzZW50YXRpb24oKTsKLQkJRWxlbWVudExpc3RTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gbmV3IEVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nKGdldFNoZWxsKCksIGxhYmVsUHJvdmlkZXIpOwotCQlkaWFsb2cuc2V0RWxlbWVudHMoY29uZmlnTGlzdC50b0FycmF5KCkpOwotCQlkaWFsb2cuc2V0VGl0bGUoIlNlbGVjdCBhIExhdW5jaCBDb25maWd1cmF0aW9uIik7Ci0JCWRpYWxvZy5zZXRNZXNzYWdlKCImU2VsZWN0IGV4aXN0aW5nIGNvbmZpZ3VyYXRpb246Iik7Ci0JCWRpYWxvZy5zZXRNdWx0aXBsZVNlbGVjdGlvbihmYWxzZSk7Ci0JCWludCByZXN1bHQgPSBkaWFsb2cub3BlbigpOwotCQlsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHJlc3VsdCA9PSBXaW5kb3cuT0spCi0JCXsKLQkJCXJldHVybiAoSUxhdW5jaENvbmZpZ3VyYXRpb24pIGRpYWxvZy5nZXRGaXJzdFJlc3VsdCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgSUxhdW5jaENvbmZpZ3VyYXRpb24gY3JlYXRlQ29uZmlndXJhdGlvbigpCi0JewotCQlJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWcgPSBudWxsOwotCQl0cnkKLQkJewotCQkJSUxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIGNvbmZpZ1R5cGUgPSBnZXRDb25maWd1cmF0aW9uVHlwZSgpOwotCQkJSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSB3YyA9IGNvbmZpZ1R5cGUubmV3SW5zdGFuY2UobnVsbCwgZ2V0TGF1bmNoTWFuYWdlcigpLmdlbmVyYXRlVW5pcXVlTGF1bmNoQ29uZmlndXJhdGlvbk5hbWVGcm9tKHhtbEZpbGVQYXRoLmxhc3RTZWdtZW50KCkpKTsKLQkJCWlmICh4bWxGaWxlICE9IG51bGwpCi0JCQkJd2Muc2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9JTlBVVF9GSUxFLCAiJHt3b3Jrc3BhY2VfbG9jOiIgKyB4bWxGaWxlLmdldEZ1bGxQYXRoKCkudG9Qb3J0YWJsZVN0cmluZygpKyJ9Iik7Ci0JCQllbHNlCi0JCQkJd2Muc2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9JTlBVVF9GSUxFLCB4bWxGaWxlUGF0aC50b1BvcnRhYmxlU3RyaW5nKCkpOwotCQkJd2Muc2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9VU0VfRkVBVFVSRVNfRlJPTV9QUkVGRVJFTkNFUywgdHJ1ZSk7Ci0JCQl3Yy5zZXRBdHRyaWJ1dGUoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1VTRV9ERUZBVUxUX09VVFBVVF9GSUxFLCB0cnVlKTsKLQkJCXdjLnNldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfVVNFX0RFRkFVTFRfUFJPQ0VTU09SLCB0cnVlKTsKLQkJCXdjLnNldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfVVNFX0RFRkFVTFRfUFJPQ0VTU09SX1dPUktJTkdfRElSLCB0cnVlKTsKLQotCQkJTGF1bmNoUGlwZWxpbmUgcGlwZWxpbmUgPSBuZXcgTGF1bmNoUGlwZWxpbmUoKTsKLQkJCWZvciAoSUZpbGUgZWxlbWVudCA6IHhzbEZpbGVzKQotCQkJewotCQkJCXBpcGVsaW5lLmFkZFRyYW5zZm9ybURlZihuZXcgTGF1bmNoVHJhbnNmb3JtKGVsZW1lbnQuZ2V0RnVsbFBhdGgoKS50b1BvcnRhYmxlU3RyaW5nKCksIExhdW5jaFRyYW5zZm9ybS5SRVNPVVJDRV9UWVBFKSk7Ci0JCQl9Ci0JCQl3Yy5zZXRBdHRyaWJ1dGUoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BJUEVMSU5FLCBwaXBlbGluZS50b1hNTCgpKTsKLQkJCWlmICh4bWxGaWxlIT1udWxsKQotCQkJCXdjLnNldE1hcHBlZFJlc291cmNlcyhuZXcgSVJlc291cmNlW117IHhtbEZpbGUuZ2V0UHJvamVjdCgpIH0pOwotCQkJY29uZmlnID0gd2MuZG9TYXZlKCk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjZXB0aW9uKQotCQl7Ci0JCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLCAiRXJyb3IiLCBleGNlcHRpb24uZ2V0U3RhdHVzKCkuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gY29uZmlnOwotCX0KLQotCXByb3RlY3RlZCBTaGVsbCBnZXRTaGVsbCgpCi0JewotCQlyZXR1cm4gWFNMRGVidWdVSVBsdWdpbi5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9YU0xUVGFiR3JvdXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9YU0xUVGFiR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM5ZWM1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvWFNMVFRhYkdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuQWJzdHJhY3RMYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuQ29tbW9uVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLnNvdXJjZWxvb2t1cC5Tb3VyY2VMb29rdXBUYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmRlYnVnLnVpLmxhdW5jaENvbmZpZ3VyYXRpb25zLkphdmFDbGFzc3BhdGhUYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmRlYnVnLnVpLmxhdW5jaENvbmZpZ3VyYXRpb25zLkphdmFKUkVUYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLm1haW4uWFNMTWFpblRhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMub3V0cHV0Lk91dHB1dFRhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMucHJvY2Vzc29yLlhTTFByb2Nlc3NvclRhYjsKLQotcHVibGljIGNsYXNzIFhTTFRUYWJHcm91cCBleHRlbmRzIEFic3RyYWN0TGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwCi17Ci0JcHVibGljIFhTTFRUYWJHcm91cCgpCi0JewotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZVRhYnMoSUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2cgZGlhbG9nLCBTdHJpbmcgbW9kZSkKLQl7Ci0JCVhTTE1haW5UYWIgbWFpbiA9IG5ldyBYU0xNYWluVGFiKCk7Ci0JCUlMYXVuY2hDb25maWd1cmF0aW9uVGFiW10gdGFicyA9IG5ldyBJTGF1bmNoQ29uZmlndXJhdGlvblRhYltdCi0JCXsgbWFpbiwgbmV3IFhTTFByb2Nlc3NvclRhYigpLCBuZXcgT3V0cHV0VGFiKG1haW4pLAotCQkvLyBuZXcgRk9Gb3JtYXR0ZXJUYWIoKSwKLQkJCQkvLyBuZXcgWFNMRmVhdHVyZXNUYWIoKSwKLQkJCQluZXcgSmF2YUpSRVRhYigpLCBuZXcgSmF2YUNsYXNzcGF0aFRhYigpLCBuZXcgU291cmNlTG9va3VwVGFiKCksIG5ldyBDb21tb25UYWIoKSB9OwotCQlzZXRUYWJzKHRhYnMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9hY3Rpb25zL0Fic3RyYWN0UGFyYW1ldGVyQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvYWN0aW9ucy9BYnN0cmFjdFBhcmFtZXRlckFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTEzNmQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9hY3Rpb25zL0Fic3RyYWN0UGFyYW1ldGVyQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5TZWxlY3Rpb25MaXN0ZW5lckFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMubWFpbi5QYXJhbWV0ZXJWaWV3ZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFBhcmFtZXRlckFjdGlvbiBleHRlbmRzIFNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVCA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUREID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRU1PVkUgPSAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PVkUgPSAzOwotCi0JcHJpdmF0ZSBQYXJhbWV0ZXJWaWV3ZXIgdmlld2VyOwotCXByaXZhdGUgQnV0dG9uIGJ1dHRvbjsKLQlwcml2YXRlIFNoZWxsIHNoZWxsOwotCi0JcHJvdGVjdGVkIEFic3RyYWN0UGFyYW1ldGVyQWN0aW9uKFN0cmluZyB0ZXh0LCBQYXJhbWV0ZXJWaWV3ZXIgdmlld2VyKQotCXsKLQkJc3VwZXIodGV4dCk7Ci0JCXNldFZpZXdlcih2aWV3ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZpZXdlcihQYXJhbWV0ZXJWaWV3ZXIgdmlld2VyKQotCXsKLQkJaWYgKHRoaXMudmlld2VyICE9IG51bGwpCi0JCXsKLQkJCXRoaXMudmlld2VyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJfQotCQl0aGlzLnZpZXdlciA9IHZpZXdlcjsKLQkJaWYgKHZpZXdlciAhPSBudWxsKQotCQl7Ci0JCQl2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCQkJdXBkYXRlKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgUGFyYW1ldGVyVmlld2VyIGdldFZpZXdlcigpCi0JewotCQlyZXR1cm4gdmlld2VyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJ1dHRvbihCdXR0b24gYnV0dG9uKQotCXsKLQkJdGhpcy5idXR0b24gPSBidXR0b247Ci0JCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZ0KQotCQkJewotCQkJCXJ1bigpOwotCQkJfQotCQl9KTsKLQkJYnV0dG9uLnNldEVuYWJsZWQoaXNFbmFibGVkKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKQotCXsKLQkJc3VwZXIuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJaWYgKGJ1dHRvbiAhPSBudWxsKQotCQl7Ci0JCQlidXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZSgpCi0JewotCQlzZWxlY3Rpb25DaGFuZ2VkKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0Vmlld2VyKCkuZ2V0U2VsZWN0aW9uKCkpOwotCX0KLQotCXByb3RlY3RlZCBTaGVsbCBnZXRTaGVsbCgpCi0JewotCQlpZiAoc2hlbGwgPT0gbnVsbCkKLQkJewotCQkJc2hlbGwgPSBnZXRWaWV3ZXIoKS5nZXRTaGVsbCgpOwotCQl9Ci0JCXJldHVybiBzaGVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTaGVsbChTaGVsbCBzaGVsbCkKLQl7Ci0JCXRoaXMuc2hlbGwgPSBzaGVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKQotCXsKLQkJcmV0dXJuIGdldFZpZXdlcigpLnVwZGF0ZVNlbGVjdGlvbihnZXRBY3Rpb25UeXBlKCksIHNlbGVjdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXRBY3Rpb25UeXBlKCkKLQl7Ci0JCXJldHVybiBERUZBVUxUOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9hY3Rpb25zL0Fic3RyYWN0U3R5bGVzaGVldEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL2FjdGlvbnMvQWJzdHJhY3RTdHlsZXNoZWV0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNGExZTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL2FjdGlvbnMvQWJzdHJhY3RTdHlsZXNoZWV0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5TZWxlY3Rpb25MaXN0ZW5lckFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMubWFpbi5TdHlsZXNoZWV0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmNvbmZpZy5MYXVuY2hQaXBlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5jb25maWcuTGF1bmNoVHJhbnNmb3JtOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTdHlsZXNoZWV0QWN0aW9uIGV4dGVuZHMgU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb24KLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBREQgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTU9WRSA9IDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9WRSA9IDM7Ci0KLQlwcml2YXRlIFN0eWxlc2hlZXRWaWV3ZXIgdmlld2VyOwotCXByaXZhdGUgQnV0dG9uIGJ1dHRvbjsKLQlwcml2YXRlIFNoZWxsIHNoZWxsOwotCi0JcHJvdGVjdGVkIEFic3RyYWN0U3R5bGVzaGVldEFjdGlvbihTdHJpbmcgdGV4dCwgU3R5bGVzaGVldFZpZXdlciB2aWV3ZXIpCi0JewotCQlzdXBlcih0ZXh0KTsKLQkJc2V0Vmlld2VyKHZpZXdlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkVHJhbnNmb3JtcyhMYXVuY2hUcmFuc2Zvcm1bXSByZXMpCi0JewotCQl2aWV3ZXIuYWRkVHJhbnNmb3JtcyhyZXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZpZXdlcihTdHlsZXNoZWV0Vmlld2VyIHZpZXdlcikKLQl7Ci0JCWlmICh0aGlzLnZpZXdlciAhPSBudWxsKQotCQl7Ci0JCQl0aGlzLnZpZXdlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQkJdGhpcy52aWV3ZXIgPSB2aWV3ZXI7Ci0JCWlmICh2aWV3ZXIgIT0gbnVsbCkKLQkJewotCQkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJCXVwZGF0ZSgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFN0eWxlc2hlZXRWaWV3ZXIgZ2V0Vmlld2VyKCkKLQl7Ci0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QnV0dG9uKEJ1dHRvbiBidXR0b24pCi0JewotCQl0aGlzLmJ1dHRvbiA9IGJ1dHRvbjsKLQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldnQpCi0JCQl7Ci0JCQkJcnVuKCk7Ci0JCQl9Ci0JCX0pOwotCQlidXR0b24uc2V0RW5hYmxlZChpc0VuYWJsZWQoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpCi0JewotCQlzdXBlci5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlpZiAoYnV0dG9uICE9IG51bGwpCi0JCXsKLQkJCWJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlKCkKLQl7Ci0JCXNlbGVjdGlvbkNoYW5nZWQoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRWaWV3ZXIoKS5nZXRTZWxlY3Rpb24oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFNoZWxsIGdldFNoZWxsKCkKLQl7Ci0JCWlmIChzaGVsbCA9PSBudWxsKQotCQl7Ci0JCQlzaGVsbCA9IGdldFZpZXdlcigpLmdldFNoZWxsKCk7Ci0JCX0KLQkJcmV0dXJuIHNoZWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNoZWxsKFNoZWxsIHNoZWxsKQotCXsKLQkJdGhpcy5zaGVsbCA9IHNoZWxsOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pCi0JewotCQlyZXR1cm4gZ2V0Vmlld2VyKCkudXBkYXRlU2VsZWN0aW9uKGdldEFjdGlvblR5cGUoKSwgc2VsZWN0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGdldEFjdGlvblR5cGUoKQotCXsKLQkJcmV0dXJuIERFRkFVTFQ7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3Q8Pz4gZ2V0T3JkZXJlZFNlbGVjdGlvbigpCi0JewotCQlMaXN0PD8+IHNlbGVjdGlvbiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFZpZXdlcigpLmdldFNlbGVjdGlvbigpKS50b0xpc3QoKTsKLQkJcmV0dXJuIHNlbGVjdGlvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdDxMYXVuY2hUcmFuc2Zvcm0+IGdldEVudHJpZXNBc0xpc3QoKQotCXsKLQkJLy8gSVN0eWxlc2hlZXRFbnRyeVtdIGVudHJpZXMgPSBnZXRWaWV3ZXIoKS5nZXRFbnRyaWVzKCk7Ci0JCS8vIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoZW50cmllcy5sZW5ndGgpOwotCQkvLyBmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJLy8gbGlzdC5hZGQoZW50cmllc1tpXSk7Ci0JCS8vIH0KLQkJTGF1bmNoUGlwZWxpbmUgbHAgPSAoTGF1bmNoUGlwZWxpbmUpIGdldFZpZXdlcigpLmdldElucHV0KCk7Ci0JCXJldHVybiBscC5nZXRUcmFuc2Zvcm1EZWZzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RW50cmllcyhMaXN0PD8+IGxpc3QpCi0JewotCQlnZXRWaWV3ZXIoKS5zZXRFbnRyaWVzKChMYXVuY2hUcmFuc2Zvcm1bXSkgbGlzdC50b0FycmF5KG5ldyBMYXVuY2hUcmFuc2Zvcm1bbGlzdC5zaXplKCldKSk7Ci0JCS8vIC8vIHVwZGF0ZSBhbGwgc2VsZWN0aW9uIGxpc3RlbmVycwotCQkvLyBnZXRWaWV3ZXIoKS5zZXRTZWxlY3Rpb24oZ2V0Vmlld2VyKCkuZ2V0U2VsZWN0aW9uKCkpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzSW5kZXhTZWxlY3RlZChJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24sIGludCBpbmRleCkKLQl7Ci0JCWlmIChzZWxlY3Rpb24uaXNFbXB0eSgpKQotCQl7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJSXRlcmF0b3I8Pz4gZW50cmllcyA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOwotCQlMaXN0PD8+IGxpc3QgPSBnZXRFbnRyaWVzQXNMaXN0KCk7Ci0JCXdoaWxlIChlbnRyaWVzLmhhc05leHQoKSkKLQkJewotCQkJT2JqZWN0IG5leHQgPSBlbnRyaWVzLm5leHQoKTsKLQkJCWlmIChsaXN0LmluZGV4T2YobmV4dCkgPT0gaW5kZXgpCi0JCQl7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL2FjdGlvbnMvQWN0aW9uTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9hY3Rpb25zL0FjdGlvbk1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YzEwMmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL2FjdGlvbnMvQWN0aW9uTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBBY3Rpb25NZXNzYWdlcyBleHRlbmRzIE5MUwotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLmFjdGlvbnMuQWN0aW9uTWVzc2FnZXMiOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVtb3ZlQWN0aW9uX1RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRXb3Jrc3BhY2VGaWxlQWN0aW9uX1RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRFeHRlcm5hbEZpbGVBY3Rpb25fVGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1vdmVEb3duQWN0aW9uX1RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNb3ZlVXBBY3Rpb25fVGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZEV4dGVybmFsRmlsZUFjdGlvbl9TZWxlY3Rpb25fMzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFdvcmtzcGFjZUZpbGVBY3Rpb25fRGlhbG9nTWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFdvcmtzcGFjZUZpbGVBY3Rpb25fRGlhbG9nVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0U3R5bGVzaGVldFBhcmFtZXRlcnNBY3Rpb25fVGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFBhcmFtZXRlckFjdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW92ZVBhcmFtZXRlckFjdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhcmlhYmxlc0ZpZWxkQnV0dG9uX1RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRQYXJhbWV0ZXJBY3Rpb25fRGlhbG9nOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkUGFyYW1ldGVyQWN0aW9uX0RpYWxvZ19MYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFBhcmFtZXRlckFjdGlvbl9EaWFsb2dfTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFBhcmFtZXRlckFjdGlvbl9EaWFsb2dfVHlwZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFBhcmFtZXRlckFjdGlvbl9EaWFsb2dfVmFsdWU7Ci0KLQlzdGF0aWMKLQl7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEFjdGlvbk1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9hY3Rpb25zL0FjdGlvbk1lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvYWN0aW9ucy9BY3Rpb25NZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTFhYWE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9hY3Rpb25zL0FjdGlvbk1lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1SZW1vdmVBY3Rpb25fVGV4dD1SZW1vdmUKLUFkZFdvcmtzcGFjZUZpbGVBY3Rpb25fVGV4dD1BZGQgRmlsZXMKLUFkZEV4dGVybmFsRmlsZUFjdGlvbl9UZXh0PUFkZCBFeHRlcm5hbCBGaWxlcwotTW92ZURvd25BY3Rpb25fVGV4dD1Nb3ZlIERvd24KLU1vdmVVcEFjdGlvbl9UZXh0PU1vdmUgVXAKLUFkZEV4dGVybmFsRmlsZUFjdGlvbl9TZWxlY3Rpb25fMz0KLUFkZFdvcmtzcGFjZUZpbGVBY3Rpb25fRGlhbG9nTWVzc2FnZT1DaG9vc2UgU3R5bGVzaGVldAotQWRkV29ya3NwYWNlRmlsZUFjdGlvbl9EaWFsb2dUaXRsZT0KLUVkaXRTdHlsZXNoZWV0UGFyYW1ldGVyc0FjdGlvbl9UZXh0PUVkaXQgUGFyYW1ldGVycwotQWRkUGFyYW1ldGVyQWN0aW9uPUFkZCBQYXJhbWV0ZXIKLVJlbW92ZVBhcmFtZXRlckFjdGlvbj1SZW1vdmUgUGFyYW1ldGVyCi1WYXJpYWJsZXNGaWVsZEJ1dHRvbl9UZXh0PVZhcmlhYmxlcy4uLgotQWRkUGFyYW1ldGVyQWN0aW9uX0RpYWxvZz1BZGQgWFNMVCBQYXJhbWV0ZXIKLUFkZFBhcmFtZXRlckFjdGlvbl9EaWFsb2dfTGFiZWw9QWRkUGFyYW1ldGVyQWN0aW9uX0RpYWxvZ19MYWJlbAotQWRkUGFyYW1ldGVyQWN0aW9uX0RpYWxvZ19OYW1lPU5hbWU6Ci1BZGRQYXJhbWV0ZXJBY3Rpb25fRGlhbG9nX1R5cGU9VHlwZToKLUFkZFBhcmFtZXRlckFjdGlvbl9EaWFsb2dfVmFsdWU9VmFsdWU6CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvYWN0aW9ucy9BZGRFeHRlcm5hbEZpbGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9hY3Rpb25zL0FkZEV4dGVybmFsRmlsZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDNmMzMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9hY3Rpb25zL0FkZEV4dGVybmFsRmlsZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMubWFpbi5TdHlsZXNoZWV0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmNvbmZpZy5MYXVuY2hUcmFuc2Zvcm07Ci0KLXB1YmxpYyBjbGFzcyBBZGRFeHRlcm5hbEZpbGVBY3Rpb24gZXh0ZW5kcyBPcGVuRGlhbG9nQWN0aW9uCi17Ci0KLQlwdWJsaWMgQWRkRXh0ZXJuYWxGaWxlQWN0aW9uKFN0eWxlc2hlZXRWaWV3ZXIgdmlld2VyLCBTdHJpbmcgZGlhbG9nU2V0dGluZ3NQcmVmaXgpCi0JewotCQlzdXBlcihBY3Rpb25NZXNzYWdlcy5BZGRFeHRlcm5hbEZpbGVBY3Rpb25fVGV4dCwgdmlld2VyLCBkaWFsb2dTZXR0aW5nc1ByZWZpeCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcnVuKCkKLQl7Ci0JCVN0cmluZyBsYXN0VXNlZFBhdGggPSBnZXREaWFsb2dTZXR0aW5nKExBU1RfUEFUSF9TRVRUSU5HKTsKLQkJaWYgKGxhc3RVc2VkUGF0aCA9PSBudWxsKQotCQl7Ci0JCQlsYXN0VXNlZFBhdGggPSAiIjsKLQkJfQotCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKGdldFNoZWxsKCksIFNXVC5NVUxUSSk7Ci0JCWRpYWxvZy5zZXRUZXh0KEFjdGlvbk1lc3NhZ2VzLkFkZEV4dGVybmFsRmlsZUFjdGlvbl9TZWxlY3Rpb25fMyk7Ci0JCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKGxhc3RVc2VkUGF0aCk7Ci0JCWRpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXXsgIioueHNsIiB9KTsKLQkJU3RyaW5nIHJlcyA9IGRpYWxvZy5vcGVuKCk7Ci0JCWlmIChyZXMgPT0gbnVsbCkKLQkJewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSVBhdGggZmlsdGVyUGF0aCA9IG5ldyBQYXRoKGRpYWxvZy5nZXRGaWx0ZXJQYXRoKCkpOwotCQlMYXVuY2hUcmFuc2Zvcm1bXSBsdHMgPSBuZXcgTGF1bmNoVHJhbnNmb3JtWzFdOwotCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgocmVzKS5tYWtlQWJzb2x1dGUoKTsKLQkJbHRzWzBdID0gbmV3IExhdW5jaFRyYW5zZm9ybShwYXRoLnRvUG9ydGFibGVTdHJpbmcoKSwgTGF1bmNoVHJhbnNmb3JtLkVYVEVSTkFMX1RZUEUpOwotCi0JCXNldERpYWxvZ1NldHRpbmcoTEFTVF9QQVRIX1NFVFRJTkcsIGZpbHRlclBhdGgudG9PU1N0cmluZygpKTsKLQotCQlhZGRUcmFuc2Zvcm1zKGx0cyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL2FjdGlvbnMvQWRkUGFyYW1ldGVyQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvYWN0aW9ucy9BZGRQYXJhbWV0ZXJBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUxMjkyMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvYWN0aW9ucy9BZGRQYXJhbWV0ZXJBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLm1haW4uUGFyYW1ldGVyVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmNvbmZpZy5MYXVuY2hBdHRyaWJ1dGU7Ci0KLXB1YmxpYyBjbGFzcyBBZGRQYXJhbWV0ZXJBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFBhcmFtZXRlckFjdGlvbgotewotCWZpbmFsIFN0cmluZ1tdIHR5cGVzID0gbmV3IFN0cmluZ1tdCi0JeyBMYXVuY2hBdHRyaWJ1dGUuVFlQRV9TVFJJTkcsIExhdW5jaEF0dHJpYnV0ZS5UWVBFX0JPT0xFQU4sIExhdW5jaEF0dHJpYnV0ZS5UWVBFX0lOVCwgTGF1bmNoQXR0cmlidXRlLlRZUEVfRE9VQkxFLCBMYXVuY2hBdHRyaWJ1dGUuVFlQRV9GTE9BVCwgTGF1bmNoQXR0cmlidXRlLlRZUEVfT0JKRUNULAotCQkJTGF1bmNoQXR0cmlidXRlLlRZUEVfQ0xBU1MsIH07Ci0KLQlwdWJsaWMgQWRkUGFyYW1ldGVyQWN0aW9uKFBhcmFtZXRlclZpZXdlciB2aWV3ZXIpCi0JewotCQlzdXBlcihBY3Rpb25NZXNzYWdlcy5BZGRQYXJhbWV0ZXJBY3Rpb24sIHZpZXdlcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcnVuKCkKLQl7Ci0JCU11bHRpcGxlSW5wdXREaWFsb2cgZGlhbG9nID0gbmV3IE11bHRpcGxlSW5wdXREaWFsb2coZ2V0U2hlbGwoKSwgQWN0aW9uTWVzc2FnZXMuQWRkUGFyYW1ldGVyQWN0aW9uX0RpYWxvZyk7Ci0JCVN0cmluZyBuYW1lbGFiZWwgPSBBY3Rpb25NZXNzYWdlcy5BZGRQYXJhbWV0ZXJBY3Rpb25fRGlhbG9nX05hbWU7Ci0JCWRpYWxvZy5hZGRUZXh0RmllbGQobmFtZWxhYmVsLCBudWxsLCBmYWxzZSk7Ci0JCVN0cmluZyB0eXBlbGFiZWwgPSBBY3Rpb25NZXNzYWdlcy5BZGRQYXJhbWV0ZXJBY3Rpb25fRGlhbG9nX1R5cGU7Ci0JCWRpYWxvZy5hZGRDb21ib0ZpZWxkKHR5cGVsYWJlbCwgMCwgdHlwZXMpOwotCQlTdHJpbmcgdmFyaWFibGVzbGFiZWwgPSBBY3Rpb25NZXNzYWdlcy5BZGRQYXJhbWV0ZXJBY3Rpb25fRGlhbG9nX1ZhbHVlOwotCQlkaWFsb2cuYWRkVmFyaWFibGVzRmllbGQodmFyaWFibGVzbGFiZWwsIG51bGwsIGZhbHNlKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQotCQlpZiAoZGlhbG9nLmdldFJldHVybkNvZGUoKSA9PSBXaW5kb3cuT0spCi0JCXsKLQkJCVN0cmluZyBuYW1lID0gZGlhbG9nLmdldFN0cmluZ1ZhbHVlKG5hbWVsYWJlbCk7Ci0JCQlpbnQgdHlwZSA9IGRpYWxvZy5nZXRJbnRWYWx1ZSh0eXBlbGFiZWwpOwotCQkJU3RyaW5nIHZhbHVlID0gZGlhbG9nLmdldFN0cmluZ1ZhbHVlKHZhcmlhYmxlc2xhYmVsKTsKLQkJCUxhdW5jaEF0dHJpYnV0ZSBwYXJhbWV0ZXIgPSBudWxsOwotCQkJaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUuaW5kZXhPZigiJHsiKSA+IC0xKQotCQkJCXBhcmFtZXRlciA9IG5ldyBMYXVuY2hBdHRyaWJ1dGUobmFtZSwgdHlwZXNbdHlwZV0sIHZhbHVlKTsKLQkJCWVsc2UKLQkJCQlwYXJhbWV0ZXIgPSBuZXcgTGF1bmNoQXR0cmlidXRlKG5hbWUsIHR5cGVzW3R5cGVdLCB2YWx1ZSk7Ci0JCQlnZXRWaWV3ZXIoKS5hZGRQYXJhbWV0ZXIocGFyYW1ldGVyKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKQotCXsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL2FjdGlvbnMvQWRkV29ya3NwYWNlRmlsZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL2FjdGlvbnMvQWRkV29ya3NwYWNlRmlsZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGVjZWI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9hY3Rpb25zL0FkZFdvcmtzcGFjZUZpbGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5uYXZpZ2F0b3IuUmVzb3VyY2VTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5YU0xEZWJ1Z1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5tYWluLlN0eWxlc2hlZXRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuY29uZmlnLkxhdW5jaFRyYW5zZm9ybTsKLQotcHVibGljIGNsYXNzIEFkZFdvcmtzcGFjZUZpbGVBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFN0eWxlc2hlZXRBY3Rpb24KLXsKLQlwcml2YXRlIGZpbmFsIElTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3IgdmFsaWRhdG9yID0gbmV3IElTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3IoKQotCXsKLQkJcHVibGljIElTdGF0dXMgdmFsaWRhdGUoT2JqZWN0W10gc2VsZWN0aW9uKQotCQl7Ci0JCQlpZiAoc2VsZWN0aW9uLmxlbmd0aCA9PSAwKQotCQkJewotCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFhTTERlYnVnVUlQbHVnaW4uUExVR0lOX0lELCAwLCAiIiwgbnVsbCk7Ci0JCQl9Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGlvbi5sZW5ndGg7IGkrKykKLQkJCXsKLQkJCQlpZiAoIShzZWxlY3Rpb25baV0gaW5zdGFuY2VvZiBJRmlsZSkpCi0JCQkJewotCQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBYU0xEZWJ1Z1VJUGx1Z2luLlBMVUdJTl9JRCwgMCwgIiIsIG51bGwpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIFhTTERlYnVnVUlQbHVnaW4uUExVR0lOX0lELCAwLCAiIiwgbnVsbCk7Ci0JCX0KLQl9OwotCi0JcHVibGljIEFkZFdvcmtzcGFjZUZpbGVBY3Rpb24oU3R5bGVzaGVldFZpZXdlciB2aWV3ZXIpCi0JewotCQlzdXBlcihBY3Rpb25NZXNzYWdlcy5BZGRXb3Jrc3BhY2VGaWxlQWN0aW9uX1RleHQsIHZpZXdlcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcnVuKCkKLQl7Ci0KLQkJLy8gVmlld2VyRmlsdGVyIGZpbHRlcj0gbmV3IFN0eWxlc2hlZXRGaWx0ZXIoZ2V0U2VsZWN0ZWRKYXJzKCkpOwotCi0JCUlMYWJlbFByb3ZpZGVyIGxwID0gbmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKTsKLQkJSVRyZWVDb250ZW50UHJvdmlkZXIgY3AgPSBuZXcgV29ya2JlbmNoQ29udGVudFByb3ZpZGVyKCk7Ci0KLQkJRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gbmV3IEVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nKGdldFNoZWxsKCksIGxwLCBjcCk7Ci0JCWRpYWxvZy5zZXRWYWxpZGF0b3IodmFsaWRhdG9yKTsKLQkJZGlhbG9nLnNldFRpdGxlKEFjdGlvbk1lc3NhZ2VzLkFkZFdvcmtzcGFjZUZpbGVBY3Rpb25fRGlhbG9nVGl0bGUpOwotCQlkaWFsb2cuc2V0TWVzc2FnZShBY3Rpb25NZXNzYWdlcy5BZGRXb3Jrc3BhY2VGaWxlQWN0aW9uX0RpYWxvZ01lc3NhZ2UpOwotCQlkaWFsb2cuYWRkRmlsdGVyKG5ldyBWaWV3ZXJGaWx0ZXIoKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0IGVsZW1lbnQpCi0JCQl7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ29udGFpbmVyKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSBlbGVtZW50OwotCQkJCVN0cmluZyBmaWxlRXh0ID0gZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0JCQkJaWYgKGZpbGVFeHQgIT0gbnVsbCAmJiBmaWxlRXh0LmVxdWFsc0lnbm9yZUNhc2UoInhzbCIpKQotCQkJCXsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfSk7Ci0JCWRpYWxvZy5zZXRJbnB1dChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLQkJZGlhbG9nLnNldFNvcnRlcihuZXcgUmVzb3VyY2VTb3J0ZXIoUmVzb3VyY2VTb3J0ZXIuTkFNRSkpOwotCi0JCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykKLQkJewotCQkJT2JqZWN0W10gZWxlbWVudHMgPSBkaWFsb2cuZ2V0UmVzdWx0KCk7Ci0JCQlMYXVuY2hUcmFuc2Zvcm1bXSByZXMgPSBuZXcgTGF1bmNoVHJhbnNmb3JtW2VsZW1lbnRzLmxlbmd0aF07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlcy5sZW5ndGg7IGkrKykKLQkJCXsKLQkJCQlJUmVzb3VyY2UgZWxlbSA9IChJUmVzb3VyY2UpIGVsZW1lbnRzW2ldOwotCQkJCXJlc1tpXSA9IG5ldyBMYXVuY2hUcmFuc2Zvcm0oZWxlbS5nZXRGdWxsUGF0aCgpLnRvUG9ydGFibGVTdHJpbmcoKSwgTGF1bmNoVHJhbnNmb3JtLlJFU09VUkNFX1RZUEUpOwotCQkJfQotCQkJYWRkVHJhbnNmb3JtcyhyZXMpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGludCBnZXRBY3Rpb25UeXBlKCkKLQl7Ci0JCXJldHVybiBBREQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL2FjdGlvbnMvQ29udHJvbEFjY2Vzc2libGVMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL2FjdGlvbnMvQ29udHJvbEFjY2Vzc2libGVMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODE4MTlmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9hY3Rpb25zL0NvbnRyb2xBY2Nlc3NpYmxlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotCi1wdWJsaWMgY2xhc3MgQ29udHJvbEFjY2Vzc2libGVMaXN0ZW5lciBleHRlbmRzIEFjY2Vzc2libGVBZGFwdGVyCi17Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY29udHJvbE5hbWU7Ci0KLQlwdWJsaWMgQ29udHJvbEFjY2Vzc2libGVMaXN0ZW5lcihTdHJpbmcgbmFtZSkKLQl7Ci0JCWNvbnRyb2xOYW1lID0gbmFtZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKQotCXsKLQkJZS5yZXN1bHQgPSBjb250cm9sTmFtZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkTGlzdGVuZXIoQ29udHJvbCBjb21wLCBTdHJpbmcgbmFtZSkKLQl7Ci0JCS8vIHN0cmlwIG1uZW1vbmljCi0JCVN0cmluZ1tdIHN0cnMgPSBuYW1lLnNwbGl0KCImIik7Ci0JCVN0cmluZ0J1ZmZlciBzdHJpcHBlZCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChTdHJpbmcgZWxlbWVudCA6IHN0cnMpCi0JCXsKLQkJCXN0cmlwcGVkLmFwcGVuZChlbGVtZW50KTsKLQkJfQotCQljb21wLmdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIobmV3IENvbnRyb2xBY2Nlc3NpYmxlTGlzdGVuZXIoc3RyaXBwZWQudG9TdHJpbmcoKSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9hY3Rpb25zL01vdmVEb3duQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvYWN0aW9ucy9Nb3ZlRG93bkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjkzOGNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9hY3Rpb25zL01vdmVEb3duQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLm1haW4uU3R5bGVzaGVldFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5jb25maWcuTGF1bmNoVHJhbnNmb3JtOwotCi1wdWJsaWMgY2xhc3MgTW92ZURvd25BY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFN0eWxlc2hlZXRBY3Rpb24KLXsKLQlwdWJsaWMgTW92ZURvd25BY3Rpb24oU3R5bGVzaGVldFZpZXdlciB2aWV3ZXIpCi0JewotCQlzdXBlcihBY3Rpb25NZXNzYWdlcy5Nb3ZlRG93bkFjdGlvbl9UZXh0LCB2aWV3ZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJ1bigpCi0JewotCQlMaXN0PD8+IHRhcmdldHMgPSBnZXRPcmRlcmVkU2VsZWN0aW9uKCk7Ci0JCWlmICh0YXJnZXRzLmlzRW1wdHkoKSkKLQkJewotCQkJcmV0dXJuOwotCQl9Ci0JCUxpc3Q8TGF1bmNoVHJhbnNmb3JtPiBsaXN0ID0gZ2V0RW50cmllc0FzTGlzdCgpOwotCQlpbnQgYm90dG9tID0gbGlzdC5zaXplKCkgLSAxOwotCQlpbnQgaW5kZXggPSAwOwotCQlmb3IgKGludCBpID0gdGFyZ2V0cy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkKLQkJewotCQkJT2JqZWN0IHRhcmdldCA9IHRhcmdldHMuZ2V0KGkpOwotCQkJaW5kZXggPSBsaXN0LmluZGV4T2YodGFyZ2V0KTsKLQkJCWlmIChpbmRleCA8IGJvdHRvbSkKLQkJCXsKLQkJCQlib3R0b20gPSBpbmRleCArIDE7Ci0JCQkJT2JqZWN0IHRlbXAgPSBsaXN0LmdldChib3R0b20pOwotCQkJCWxpc3Quc2V0KGJvdHRvbSwgKExhdW5jaFRyYW5zZm9ybSl0YXJnZXQpOwotCQkJCWxpc3Quc2V0KGluZGV4LCAoTGF1bmNoVHJhbnNmb3JtKXRlbXApOwotCQkJfQotCQkJYm90dG9tID0gaW5kZXg7Ci0JCX0KLQkJc2V0RW50cmllcyhsaXN0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKQotCXsKLQkJaWYgKHNlbGVjdGlvbi5pc0VtcHR5KCkpCi0JCXsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gZ2V0Vmlld2VyKCkudXBkYXRlU2VsZWN0aW9uKGdldEFjdGlvblR5cGUoKSwgc2VsZWN0aW9uKSAmJiAhaXNJbmRleFNlbGVjdGVkKHNlbGVjdGlvbiwgZ2V0RW50cmllc0FzTGlzdCgpLnNpemUoKSAtIDEpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBpbnQgZ2V0QWN0aW9uVHlwZSgpCi0JewotCQlyZXR1cm4gTU9WRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvYWN0aW9ucy9Nb3ZlVXBBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9hY3Rpb25zL01vdmVVcEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDZmNTI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9hY3Rpb25zL01vdmVVcEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMubWFpbi5TdHlsZXNoZWV0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmNvbmZpZy5MYXVuY2hUcmFuc2Zvcm07Ci0KLXB1YmxpYyBjbGFzcyBNb3ZlVXBBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFN0eWxlc2hlZXRBY3Rpb24KLXsKLQlwdWJsaWMgTW92ZVVwQWN0aW9uKFN0eWxlc2hlZXRWaWV3ZXIgdmlld2VyKQotCXsKLQkJc3VwZXIoQWN0aW9uTWVzc2FnZXMuTW92ZVVwQWN0aW9uX1RleHQsIHZpZXdlcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcnVuKCkKLQl7Ci0JCUxpc3Q8Pz4gdGFyZ2V0cyA9IGdldE9yZGVyZWRTZWxlY3Rpb24oKTsKLQkJaWYgKHRhcmdldHMuaXNFbXB0eSgpKQotCQl7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaW50IHRvcCA9IDA7Ci0JCWludCBpbmRleCA9IDA7Ci0JCUxpc3Q8TGF1bmNoVHJhbnNmb3JtPiBsaXN0ID0gZ2V0RW50cmllc0FzTGlzdCgpOwotCQlJdGVyYXRvcjw/PiBlbnRyaWVzID0gdGFyZ2V0cy5pdGVyYXRvcigpOwotCQl3aGlsZSAoZW50cmllcy5oYXNOZXh0KCkpCi0JCXsKLQkJCU9iamVjdCB0YXJnZXQgPSBlbnRyaWVzLm5leHQoKTsKLQkJCWluZGV4ID0gbGlzdC5pbmRleE9mKHRhcmdldCk7Ci0JCQlpZiAoaW5kZXggPiB0b3ApCi0JCQl7Ci0JCQkJdG9wID0gaW5kZXggLSAxOwotCQkJCU9iamVjdCB0ZW1wID0gbGlzdC5nZXQodG9wKTsKLQkJCQlsaXN0LnNldCh0b3AsIChMYXVuY2hUcmFuc2Zvcm0pdGFyZ2V0KTsKLQkJCQlsaXN0LnNldChpbmRleCwgKExhdW5jaFRyYW5zZm9ybSl0ZW1wKTsKLQkJCX0KLQkJCXRvcCA9IGluZGV4OwotCQl9Ci0JCXNldEVudHJpZXMobGlzdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikKLQl7Ci0JCWlmIChzZWxlY3Rpb24uaXNFbXB0eSgpKQotCQl7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGdldFZpZXdlcigpLnVwZGF0ZVNlbGVjdGlvbihnZXRBY3Rpb25UeXBlKCksIHNlbGVjdGlvbikgJiYgIWlzSW5kZXhTZWxlY3RlZChzZWxlY3Rpb24sIDApOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBpbnQgZ2V0QWN0aW9uVHlwZSgpCi0JewotCQlyZXR1cm4gTU9WRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvYWN0aW9ucy9NdWx0aXBsZUlucHV0RGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvYWN0aW9ucy9NdWx0aXBsZUlucHV0RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MGU1NWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL2FjdGlvbnMvTXVsdGlwbGVJbnB1dERpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5TdHJpbmdWYXJpYWJsZVNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNjcm9sbGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLlhTTERlYnVnVUlQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBNdWx0aXBsZUlucHV0RGlhbG9nIGV4dGVuZHMgRGlhbG9nCi17Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklFTERfTkFNRSA9ICJGSUVMRF9OQU1FIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBURVhUID0gMTAwOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEJST1dTRSA9IDEwMTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBWQVJJQUJMRSA9IDEwMjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBDT01CTyA9IDEwMzsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgcGFuZWw7Ci0KLQlwcm90ZWN0ZWQgTGlzdDxGaWVsZFN1bW1hcnk+IGZpZWxkTGlzdCA9IG5ldyBBcnJheUxpc3Q8RmllbGRTdW1tYXJ5PigpOwotCXByb3RlY3RlZCBMaXN0PFNjcm9sbGFibGU+IGNvbnRyb2xMaXN0ID0gbmV3IEFycmF5TGlzdDxTY3JvbGxhYmxlPigpOwotCXByb3RlY3RlZCBMaXN0PFZhbGlkYXRvcj4gdmFsaWRhdG9ycyA9IG5ldyBBcnJheUxpc3Q8VmFsaWRhdG9yPigpOwotCXByb3RlY3RlZCBNYXA8T2JqZWN0LCBDb21wYXJhYmxlPiB2YWx1ZU1hcCA9IG5ldyBIYXNoTWFwPE9iamVjdCwgQ29tcGFyYWJsZT4oKTsKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIHRpdGxlOwotCi0JcHVibGljIE11bHRpcGxlSW5wdXREaWFsb2coU2hlbGwgc2hlbGwsIFN0cmluZyB0aXRsZSkKLQl7Ci0JCXN1cGVyKHNoZWxsKTsKLQkJdGhpcy50aXRsZSA9IHRpdGxlOwotCQlzZXRTaGVsbFN0eWxlKGdldFNoZWxsU3R5bGUoKSB8IFNXVC5SRVNJWkUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKQotCXsKLQkJc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotCQlpZiAodGl0bGUgIT0gbnVsbCkKLQkJewotCQkJc2hlbGwuc2V0VGV4dCh0aXRsZSk7Ci0JCX0KLQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KQotCXsKLQkJQ29udHJvbCBiYXIgPSBzdXBlci5jcmVhdGVCdXR0b25CYXIocGFyZW50KTsKLQkJdmFsaWRhdGVGaWVsZHMoKTsKLQkJcmV0dXJuIGJhcjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpCi0JewotCQlDb21wb3NpdGUgY29udGFpbmVyID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQkvLyAoKEdyaWREYXRhKSBwYXJlbnQuZ2V0TGF5b3V0RGF0YSgpKS5oZWlnaHRIaW50ID0gNDAwOwotCQkvLyAoKEdyaWREYXRhKSBwYXJlbnQuZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSA0MDA7Ci0KLQkJY29udGFpbmVyLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCi0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCS8vIGdkLmhlaWdodEhpbnQgPSAyMDA7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlwYW5lbCA9IG5ldyBDb21wb3NpdGUoY29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQlwYW5lbC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJZm9yIChJdGVyYXRvcjxGaWVsZFN1bW1hcnk+IGkgPSBmaWVsZExpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotCQl7Ci0JCQlGaWVsZFN1bW1hcnkgZmllbGQgPSAoRmllbGRTdW1tYXJ5KSBpLm5leHQoKTsKLQkJCXN3aXRjaCAoZmllbGQudHlwZSkKLQkJCXsKLQkJCQljYXNlIFRFWFQ6Ci0JCQkJCWNyZWF0ZVRleHRGaWVsZChmaWVsZC5uYW1lLCBmaWVsZC5pbml0aWFsVmFsdWUsIGZpZWxkLmFsbG93c0VtcHR5KTsKLQkJCQkJYnJlYWs7Ci0JCQkJLy8gY2FzZSBCUk9XU0U6Ci0JCQkJLy8gY3JlYXRlQnJvd3NlRmllbGQoZmllbGQubmFtZSwgZmllbGQuaW5pdGlhbFZhbHVlLAotCQkJCS8vIGZpZWxkLmFsbG93c0VtcHR5KTsKLQkJCQkvLyBicmVhazsKLQkJCQljYXNlIFZBUklBQkxFOgotCQkJCQljcmVhdGVWYXJpYWJsZXNGaWVsZChmaWVsZC5uYW1lLCBmaWVsZC5pbml0aWFsVmFsdWUsIGZpZWxkLmFsbG93c0VtcHR5KTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDT01CTzoKLQkJCQkJY3JlYXRlQ29tYm9GaWVsZChmaWVsZC5uYW1lLCBmaWVsZC5pbml0aWFsSW5kZXgsIGZpZWxkLml0ZW1zKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlmaWVsZExpc3QgPSBudWxsOyAvLyBhbGxvdyBpdCB0byBiZSBnYydkCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29udGFpbmVyKTsKLQotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEJyb3dzZUZpZWxkKFN0cmluZyBsYWJlbFRleHQsIFN0cmluZyBpbml0aWFsVmFsdWUsIGJvb2xlYW4gYWxsb3dzRW1wdHkpCi0JewotCQlmaWVsZExpc3QuYWRkKG5ldyBGaWVsZFN1bW1hcnkoQlJPV1NFLCBsYWJlbFRleHQsIGluaXRpYWxWYWx1ZSwgYWxsb3dzRW1wdHkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRUZXh0RmllbGQoU3RyaW5nIGxhYmVsVGV4dCwgU3RyaW5nIGluaXRpYWxWYWx1ZSwgYm9vbGVhbiBhbGxvd3NFbXB0eSkKLQl7Ci0JCWZpZWxkTGlzdC5hZGQobmV3IEZpZWxkU3VtbWFyeShURVhULCBsYWJlbFRleHQsIGluaXRpYWxWYWx1ZSwgYWxsb3dzRW1wdHkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRWYXJpYWJsZXNGaWVsZChTdHJpbmcgbGFiZWxUZXh0LCBTdHJpbmcgaW5pdGlhbFZhbHVlLCBib29sZWFuIGFsbG93c0VtcHR5KQotCXsKLQkJZmllbGRMaXN0LmFkZChuZXcgRmllbGRTdW1tYXJ5KFZBUklBQkxFLCBsYWJlbFRleHQsIGluaXRpYWxWYWx1ZSwgYWxsb3dzRW1wdHkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRDb21ib0ZpZWxkKFN0cmluZyBsYWJlbFRleHQsIGludCBpbml0aWFsSW5kZXgsIFN0cmluZ1tdIGl0ZW1zKQotCXsKLQkJZmllbGRMaXN0LmFkZChuZXcgRmllbGRTdW1tYXJ5KENPTUJPLCBsYWJlbFRleHQsIGl0ZW1zLCBpbml0aWFsSW5kZXgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUZXh0RmllbGQoU3RyaW5nIGxhYmVsVGV4dCwgU3RyaW5nIGluaXRpYWxWYWx1ZSwgYm9vbGVhbiBhbGxvd0VtcHR5KQotCXsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFuZWwsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChsYWJlbFRleHQpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORykpOwotCi0JCWZpbmFsIFRleHQgdGV4dCA9IG5ldyBUZXh0KHBhbmVsLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXRleHQuc2V0RGF0YShGSUVMRF9OQU1FLCBsYWJlbFRleHQpOwotCi0JCS8vIG1ha2Ugc3VyZSByb3dzIGFyZSB0aGUgc2FtZSBoZWlnaHQgb24gYm90aCBwYW5lbHMuCi0JCWxhYmVsLnNldFNpemUobGFiZWwuZ2V0U2l6ZSgpLngsIHRleHQuZ2V0U2l6ZSgpLnkpOwotCi0JCWlmIChpbml0aWFsVmFsdWUgIT0gbnVsbCkKLQkJewotCQkJdGV4dC5zZXRUZXh0KGluaXRpYWxWYWx1ZSk7Ci0JCX0KLQotCQlpZiAoIWFsbG93RW1wdHkpCi0JCXsKLQkJCXZhbGlkYXRvcnMuYWRkKG5ldyBWYWxpZGF0b3IoKQotCQkJewotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlKCkKLQkJCQl7Ci0JCQkJCXJldHVybiAhdGV4dC5nZXRUZXh0KCkuZXF1YWxzKCIiKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCXRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkKLQkJCXsKLQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpCi0JCQkJewotCQkJCQl2YWxpZGF0ZUZpZWxkcygpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQkJY29udHJvbExpc3QuYWRkKHRleHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZVZhcmlhYmxlc0ZpZWxkKFN0cmluZyBsYWJlbFRleHQsIFN0cmluZyBpbml0aWFsVmFsdWUsIGJvb2xlYW4gYWxsb3dFbXB0eSkKLQl7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhbmVsLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQobGFiZWxUZXh0KTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQotCQlDb21wb3NpdGUgY29tcCA9IG5ldyBDb21wb3NpdGUocGFuZWwsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29tcC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlmaW5hbCBUZXh0IHRleHQgPSBuZXcgVGV4dChjb21wLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSAyMDA7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJdGV4dC5zZXREYXRhKEZJRUxEX05BTUUsIGxhYmVsVGV4dCk7Ci0KLQkJLy8gbWFrZSBzdXJlIHJvd3MgYXJlIHRoZSBzYW1lIGhlaWdodCBvbiBib3RoIHBhbmVscy4KLQkJbGFiZWwuc2V0U2l6ZShsYWJlbC5nZXRTaXplKCkueCwgdGV4dC5nZXRTaXplKCkueSk7Ci0KLQkJaWYgKGluaXRpYWxWYWx1ZSAhPSBudWxsKQotCQl7Ci0JCQl0ZXh0LnNldFRleHQoaW5pdGlhbFZhbHVlKTsKLQkJfQotCi0JCWlmICghYWxsb3dFbXB0eSkKLQkJewotCQkJdmFsaWRhdG9ycy5hZGQobmV3IFZhbGlkYXRvcigpCi0JCQl7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoKQotCQkJCXsKLQkJCQkJcmV0dXJuICF0ZXh0LmdldFRleHQoKS5lcXVhbHMoIiIpOwotCQkJCX0KLQkJCX0pOwotCi0JCQl0ZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpCi0JCQl7Ci0JCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKQotCQkJCXsKLQkJCQkJdmFsaWRhdGVGaWVsZHMoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCi0JCUJ1dHRvbiBidXR0b24gPSBjcmVhdGVCdXR0b24oY29tcCwgSURpYWxvZ0NvbnN0YW50cy5JR05PUkVfSUQsIEFjdGlvbk1lc3NhZ2VzLlZhcmlhYmxlc0ZpZWxkQnV0dG9uX1RleHQsIGZhbHNlKTsKLQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotCQkJewotCQkJCVN0cmluZ1ZhcmlhYmxlU2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9IG5ldyBTdHJpbmdWYXJpYWJsZVNlbGVjdGlvbkRpYWxvZyhnZXRTaGVsbCgpKTsKLQkJCQlpbnQgY29kZSA9IGRpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKGNvZGUgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkKLQkJCQl7Ci0JCQkJCVN0cmluZyB2YXJpYWJsZSA9IGRpYWxvZy5nZXRWYXJpYWJsZUV4cHJlc3Npb24oKTsKLQkJCQkJaWYgKHZhcmlhYmxlICE9IG51bGwpCi0JCQkJCXsKLQkJCQkJCXRleHQuaW5zZXJ0KHZhcmlhYmxlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY29udHJvbExpc3QuYWRkKHRleHQpOwotCi0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29tYm9GaWVsZChTdHJpbmcgbGFiZWxUZXh0LCBpbnQgaW5pdGlhbFZhbHVlLCBTdHJpbmdbXSBpdGVtcykKLQl7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhbmVsLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQobGFiZWxUZXh0KTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQotCQlDb21wb3NpdGUgY29tcCA9IG5ldyBDb21wb3NpdGUocGFuZWwsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29tcC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlmaW5hbCBDb21ibyBjb21ibyA9IG5ldyBDb21ibyhjb21wLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotCQkvLyBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCS8vIGRhdGEud2lkdGhIaW50ID0gMjAwOwotCQkvLyBjb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWNvbWJvLnNldERhdGEoRklFTERfTkFNRSwgbGFiZWxUZXh0KTsKLQotCQkvLyBtYWtlIHN1cmUgcm93cyBhcmUgdGhlIHNhbWUgaGVpZ2h0IG9uIGJvdGggcGFuZWxzLgotCQlsYWJlbC5zZXRTaXplKGxhYmVsLmdldFNpemUoKS54LCBjb21iby5nZXRTaXplKCkueSk7Ci0KLQkJY29tYm8uc2V0SXRlbXMoaXRlbXMpOwotCQljb21iby5zZWxlY3QoaW5pdGlhbFZhbHVlKTsKLQotCQljb250cm9sTGlzdC5hZGQoY29tYm8pOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpCi0JewotCQlmb3IgKEl0ZXJhdG9yPFNjcm9sbGFibGU+IGkgPSBjb250cm9sTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0JCXsKLQkJCUNvbnRyb2wgY29udHJvbCA9IChDb250cm9sKSBpLm5leHQoKTsKLQkJCWlmIChjb250cm9sIGluc3RhbmNlb2YgVGV4dCkKLQkJCXsKLQkJCQl2YWx1ZU1hcC5wdXQoY29udHJvbC5nZXREYXRhKEZJRUxEX05BTUUpLCAoKFRleHQpIGNvbnRyb2wpLmdldFRleHQoKSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ29tYm8pCi0JCQl7Ci0JCQkJQ29tYm8gY29tYm8gPSAoQ29tYm8pIGNvbnRyb2w7Ci0JCQkJdmFsdWVNYXAucHV0KGNvbnRyb2wuZ2V0RGF0YShGSUVMRF9OQU1FKSwgbmV3IEludGVnZXIoY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSkpOwotCQkJfQotCQl9Ci0JCWNvbnRyb2xMaXN0ID0gbnVsbDsKLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBvcGVuKCkKLQl7Ci0JCWFwcGx5RGlhbG9nRm9udChwYW5lbCk7Ci0JCXJldHVybiBzdXBlci5vcGVuKCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZShTdHJpbmcga2V5KQotCXsKLQkJcmV0dXJuIHZhbHVlTWFwLmdldChrZXkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nVmFsdWUoU3RyaW5nIGtleSkKLQl7Ci0JCXJldHVybiAoU3RyaW5nKSBnZXRWYWx1ZShrZXkpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0SW50VmFsdWUoU3RyaW5nIGtleSkKLQl7Ci0JCXJldHVybiAoKEludGVnZXIpIGdldFZhbHVlKGtleSkpLmludFZhbHVlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmFsaWRhdGVGaWVsZHMoKQotCXsKLQkJZm9yIChJdGVyYXRvcjxWYWxpZGF0b3I+IGkgPSB2YWxpZGF0b3JzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLQkJewotCQkJVmFsaWRhdG9yIHZhbGlkYXRvciA9IChWYWxpZGF0b3IpIGkubmV4dCgpOwotCQkJaWYgKCF2YWxpZGF0b3IudmFsaWRhdGUoKSkKLQkJCXsKLQkJCQlnZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCWdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKS5zZXRFbmFibGVkKHRydWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldERpYWxvZ1NldHRpbmdzU2VjdGlvbk5hbWUoKQotCXsKLQkJcmV0dXJuIFhTTERlYnVnVUlQbHVnaW4uUExVR0lOX0lEICsgIi5NVUxUSVBMRV9JTlBVVF9ESUFMT0ciOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJRGlhbG9nU2V0dGluZ3MgZ2V0RGlhbG9nQm91bmRzU2V0dGluZ3MoKQotCXsKLQkJSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzID0gWFNMRGVidWdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQkJSURpYWxvZ1NldHRpbmdzIHNlY3Rpb24gPSBzZXR0aW5ncy5nZXRTZWN0aW9uKGdldERpYWxvZ1NldHRpbmdzU2VjdGlvbk5hbWUoKSk7Ci0JCWlmIChzZWN0aW9uID09IG51bGwpCi0JCXsKLQkJCXNlY3Rpb24gPSBzZXR0aW5ncy5hZGROZXdTZWN0aW9uKGdldERpYWxvZ1NldHRpbmdzU2VjdGlvbk5hbWUoKSk7Ci0JCX0KLQkJcmV0dXJuIHNlY3Rpb247Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIEZpZWxkU3VtbWFyeQotCXsKLQkJaW50IGluaXRpYWxJbmRleDsKLQkJaW50IHR5cGU7Ci0JCVN0cmluZyBuYW1lOwotCQlTdHJpbmcgaW5pdGlhbFZhbHVlOwotCQlib29sZWFuIGFsbG93c0VtcHR5OwotCQlTdHJpbmdbXSBpdGVtczsKLQotCQlwdWJsaWMgRmllbGRTdW1tYXJ5KGludCB0eXBlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSwgYm9vbGVhbiBhbGxvd3NFbXB0eSkKLQkJewotCQkJdGhpcy50eXBlID0gdHlwZTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmluaXRpYWxWYWx1ZSA9IGluaXRpYWxWYWx1ZTsKLQkJCXRoaXMuYWxsb3dzRW1wdHkgPSBhbGxvd3NFbXB0eTsKLQkJfQotCi0JCXB1YmxpYyBGaWVsZFN1bW1hcnkoaW50IHR5cGUsIFN0cmluZyBuYW1lLCBTdHJpbmdbXSBpdGVtcywgaW50IGluaXRpYWxJbmRleCkKLQkJewotCQkJdGhpcy50eXBlID0gdHlwZTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLml0ZW1zID0gaXRlbXM7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgVmFsaWRhdG9yCi0JewotCQlib29sZWFuIHZhbGlkYXRlKCkKLQkJewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9hY3Rpb25zL09wZW5EaWFsb2dBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9hY3Rpb25zL09wZW5EaWFsb2dBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIzYzFmYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvYWN0aW9ucy9PcGVuRGlhbG9nQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLlhTTERlYnVnVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLm1haW4uU3R5bGVzaGVldFZpZXdlcjsKLQotcHVibGljIGNsYXNzIE9wZW5EaWFsb2dBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFN0eWxlc2hlZXRBY3Rpb24KLXsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMQVNUX1BBVEhfU0VUVElORyA9ICJMQVNUX1BBVEhfU0VUVElORyI7Ci0JcHJpdmF0ZSBTdHJpbmcgZlByZWZpeCA9IG51bGw7Ci0KLQlwdWJsaWMgT3BlbkRpYWxvZ0FjdGlvbihTdHJpbmcgbGFiZWwsIFN0eWxlc2hlZXRWaWV3ZXIgdmlld2VyLCBTdHJpbmcgZGlhbG9nU2V0dGluZ3NQcmVmaXgpCi0JewotCQlzdXBlcihsYWJlbCwgdmlld2VyKTsKLQkJZlByZWZpeCA9IGRpYWxvZ1NldHRpbmdzUHJlZml4OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlhbG9nU2V0dGluZ3NQcmVmaXgoKQotCXsKLQkJcmV0dXJuIGZQcmVmaXg7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREaWFsb2dTZXR0aW5nKFN0cmluZyBzZXR0aW5nTmFtZSkKLQl7Ci0JCXJldHVybiBnZXREaWFsb2dTZXR0aW5ncygpLmdldChnZXREaWFsb2dTZXR0aW5nc1ByZWZpeCgpICsgIi4iICsgc2V0dGluZ05hbWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERpYWxvZ1NldHRpbmcoU3RyaW5nIHNldHRpbmdOYW1lLCBTdHJpbmcgdmFsdWUpCi0JewotCQlnZXREaWFsb2dTZXR0aW5ncygpLnB1dChnZXREaWFsb2dTZXR0aW5nc1ByZWZpeCgpICsgIi4iICsgc2V0dGluZ05hbWUsIHZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSURpYWxvZ1NldHRpbmdzIGdldERpYWxvZ1NldHRpbmdzKCkKLQl7Ci0JCUlEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IFhTTERlYnVnVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCXJldHVybiBzZXR0aW5nczsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgaW50IGdldEFjdGlvblR5cGUoKQotCXsKLQkJcmV0dXJuIEFERDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvYWN0aW9ucy9SZW1vdmVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9hY3Rpb25zL1JlbW92ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTgyYzhjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9hY3Rpb25zL1JlbW92ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMubWFpbi5TdHlsZXNoZWV0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmNvbmZpZy5MYXVuY2hUcmFuc2Zvcm07Ci0KLXB1YmxpYyBjbGFzcyBSZW1vdmVBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFN0eWxlc2hlZXRBY3Rpb24KLXsKLQlwdWJsaWMgUmVtb3ZlQWN0aW9uKFN0eWxlc2hlZXRWaWV3ZXIgdmlld2VyKQotCXsKLQkJc3VwZXIoQWN0aW9uTWVzc2FnZXMuUmVtb3ZlQWN0aW9uX1RleHQsIHZpZXdlcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcnVuKCkKLQl7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0Vmlld2VyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWdldFZpZXdlcigpLnJlbW92ZUVudHJpZXMoKExhdW5jaFRyYW5zZm9ybVtdKSBzZWxlY3Rpb24udG9MaXN0KCkudG9BcnJheShuZXcgTGF1bmNoVHJhbnNmb3JtWzBdKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikKLQl7Ci0JCWlmIChzZWxlY3Rpb24uaXNFbXB0eSgpKQotCQl7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGdldFZpZXdlcigpLnVwZGF0ZVNlbGVjdGlvbihnZXRBY3Rpb25UeXBlKCksIHNlbGVjdGlvbik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGludCBnZXRBY3Rpb25UeXBlKCkKLQl7Ci0JCXJldHVybiBNT1ZFOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9hY3Rpb25zL1JlbW92ZVBhcmFtZXRlckFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL2FjdGlvbnMvUmVtb3ZlUGFyYW1ldGVyQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwOTFjYTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL2FjdGlvbnMvUmVtb3ZlUGFyYW1ldGVyQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5tYWluLlBhcmFtZXRlclZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5jb25maWcuTGF1bmNoQXR0cmlidXRlOwotCi1wdWJsaWMgY2xhc3MgUmVtb3ZlUGFyYW1ldGVyQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RQYXJhbWV0ZXJBY3Rpb24KLXsKLQotCXB1YmxpYyBSZW1vdmVQYXJhbWV0ZXJBY3Rpb24oUGFyYW1ldGVyVmlld2VyIHZpZXdlcikKLQl7Ci0JCXN1cGVyKEFjdGlvbk1lc3NhZ2VzLlJlbW92ZVBhcmFtZXRlckFjdGlvbiwgdmlld2VyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBydW4oKQotCXsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gZ2V0U3RydWN0dXJlZFNlbGVjdGlvbigpOwotCQlpZiAoc2VsLnNpemUoKSA+IDApCi0JCXsKLQkJCUxhdW5jaEF0dHJpYnV0ZVtdIGVudHJpZXMgPSBuZXcgTGF1bmNoQXR0cmlidXRlW3NlbC5zaXplKCldOwotCQkJaW50IGkgPSAwOwotCQkJZm9yIChJdGVyYXRvcjw/PiBpdGVyID0gc2VsLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyBpKyspCi0JCQl7Ci0JCQkJTGF1bmNoQXR0cmlidXRlIGF0dCA9IChMYXVuY2hBdHRyaWJ1dGUpIGl0ZXIubmV4dCgpOwotCQkJCWVudHJpZXNbaV0gPSBhdHQ7Ci0JCQl9Ci0JCQlnZXRWaWV3ZXIoKS5yZW1vdmVFbnRyaWVzKGVudHJpZXMpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL2JyZWFrcG9pbnQvWFNMQnJlYWtwb2ludFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvYnJlYWtwb2ludC9YU0xCcmVha3BvaW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNkMmRlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvYnJlYWtwb2ludC9YU0xCcmVha3BvaW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLmJyZWFrcG9pbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXhlY3V0YWJsZUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSUJyZWFrcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTdG9yYWdlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkUmVzb3VyY2VNYXJrZXJBbm5vdGF0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zLklTb3VyY2VFZGl0aW5nVGV4dFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXh0ZW5zaW9ucy5icmVha3BvaW50LklCcmVha3BvaW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5YU0xEZWJ1Z1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLm1vZGVsLlhTTExpbmVCcmVha3BvaW50OwotCi1wdWJsaWMgY2xhc3MgWFNMQnJlYWtwb2ludFByb3ZpZGVyIGltcGxlbWVudHMgSUJyZWFrcG9pbnRQcm92aWRlciwgSUV4ZWN1dGFibGVFeHRlbnNpb24KLXsKLQlwdWJsaWMgSVN0YXR1cyBhZGRCcmVha3BvaW50KElEb2N1bWVudCBkb2N1bWVudCwgSUVkaXRvcklucHV0IGlucHV0LCBpbnQgZWRpdG9yTGluZU51bWJlciwgaW50IG9mZnNldCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCS8vIGNoZWNrIGlmIHRoZXJlIGlzIGEgdmFsaWQgcG9zaXRpb24gdG8gc2V0IGJyZWFrcG9pbnQKLQkJaW50IHBvcyA9IGdldFZhbGlkUG9zaXRpb24oZG9jdW1lbnQsIGVkaXRvckxpbmVOdW1iZXIpOwotCQlJU3RhdHVzIHN0YXR1cyA9IG51bGw7Ci0JCWlmIChwb3MgPj0gMCkKLQkJewotCQkJSVJlc291cmNlIHJlcyA9IGdldFJlc291cmNlRnJvbUlucHV0KGlucHV0KTsKLQkJCWlmIChyZXMgIT0gbnVsbCkKLQkJCXsKLQkJCQlib29sZWFuIGFkZCA9IHRydWU7Ci0JCQkJaWYgKGFkZCkKLQkJCQl7Ci0JCQkJCUlCcmVha3BvaW50IHBvaW50ID0gbmV3IFhTTExpbmVCcmVha3BvaW50KHJlcywgZWRpdG9yTGluZU51bWJlciwgcG9zLCBwb3MpOwotCQkJCQlpZiAocG9pbnQgPT0gbnVsbCkKLQkJCQkJewotCQkJCQkJc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBYU0xEZWJ1Z1VJUGx1Z2luLlBMVUdJTl9JRCwgSVN0YXR1cy5FUlJPUiwgInVuc3VwcG9ydGVkIGlucHV0IHR5cGUiLCBudWxsKTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCS8vIERlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCcmVha3BvaW50TWFuYWdlcigpLmFkZEJyZWFrcG9pbnQocG9pbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBJU3RvcmFnZUVkaXRvcklucHV0KQotCQkJewotCQkJCXJlcyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCQkJU3RyaW5nIGlkID0gaW5wdXQuZ2V0TmFtZSgpOwotCQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIElTdG9yYWdlRWRpdG9ySW5wdXQgJiYgKChJU3RvcmFnZUVkaXRvcklucHV0KSBpbnB1dCkuZ2V0U3RvcmFnZSgpICE9IG51bGwgJiYgKChJU3RvcmFnZUVkaXRvcklucHV0KSBpbnB1dCkuZ2V0U3RvcmFnZSgpLmdldEZ1bGxQYXRoKCkgIT0gbnVsbCkKLQkJCQl7Ci0JCQkJCWlkID0gKChJU3RvcmFnZUVkaXRvcklucHV0KSBpbnB1dCkuZ2V0U3RvcmFnZSgpLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQkJTWFwPFN0cmluZywgU3RyaW5nPiBhdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCQkJYXR0cmlidXRlcy5wdXQoU3RydWN0dXJlZFJlc291cmNlTWFya2VyQW5ub3RhdGlvbk1vZGVsLlNFQ09OREFSWV9JRF9LRVksIGlkKTsKLQkJCQlJQnJlYWtwb2ludCBwb2ludCA9IG5ldyBYU0xMaW5lQnJlYWtwb2ludChyZXMsIGVkaXRvckxpbmVOdW1iZXIsIHBvcywgcG9zKTsKLQkJCQlpZiAocG9pbnQgPT0gbnVsbCkKLQkJCQl7Ci0JCQkJCXN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgWFNMRGVidWdVSVBsdWdpbi5QTFVHSU5fSUQsIElTdGF0dXMuRVJST1IsICJ1bnN1cHBvcnRlZCBpbnB1dCB0eXBlIiwgbnVsbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChzdGF0dXMgPT0gbnVsbCkKLQkJewotCQkJc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBYU0xEZWJ1Z1VJUGx1Z2luLlBMVUdJTl9JRCwgSVN0YXR1cy5PSywgIkpTUFVJTWVzc2FnZXMuT0siLCBudWxsKTsKLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCXB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoSUVkaXRvcklucHV0IGlucHV0KQotCXsKLQkJcmV0dXJuIGdldFJlc291cmNlRnJvbUlucHV0KGlucHV0KTsKLQl9Ci0KLQlwcml2YXRlIElSZXNvdXJjZSBnZXRSZXNvdXJjZUZyb21JbnB1dChJRWRpdG9ySW5wdXQgaW5wdXQpCi0JewotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSBpbnB1dC5nZXRBZGFwdGVyKElGaWxlLmNsYXNzKTsKLQkJaWYgKHJlc291cmNlID09IG51bGwpCi0JCXsKLQkJCXJlc291cmNlID0gKElSZXNvdXJjZSkgaW5wdXQuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLQlwcml2YXRlIGludCBnZXRWYWxpZFBvc2l0aW9uKElEb2N1bWVudCBpZG9jLCBpbnQgZWRpdG9yTGluZU51bWJlcikKLQl7Ci0JCWludCByZXN1bHQgPSAtMTsKLQkJaWYgKGlkb2MgIT0gbnVsbCkKLQkJewotCQkJaW50IHN0YXJ0T2Zmc2V0ID0gMDsKLQkJCWludCBlbmRPZmZzZXQgPSAwOwotCQkJdHJ5Ci0JCQl7Ci0JCQkJSVJlZ2lvbiBsaW5lID0gaWRvYy5nZXRMaW5lSW5mb3JtYXRpb24oZWRpdG9yTGluZU51bWJlciAtIDEpOwotCQkJCXN0YXJ0T2Zmc2V0ID0gbGluZS5nZXRPZmZzZXQoKTsKLQkJCQllbmRPZmZzZXQgPSBNYXRoLm1heChsaW5lLmdldE9mZnNldCgpLCBsaW5lLmdldE9mZnNldCgpICsgbGluZS5nZXRMZW5ndGgoKSk7Ci0KLQkJCQlTdHJpbmcgbGluZVRleHQgPSBpZG9jLmdldChzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQpLnRyaW0oKTsKLQotCQkJCS8vIGJsYW5rIGxpbmVzIG9yIFBJJ3MgY2Fubm90IGhhdmUgYnJlYWtwb2ludHMKLQkJCQlpZiAobGluZVRleHQudHJpbSgpLmVxdWFscygiIikgfHwgbGluZVRleHQuc3RhcnRzV2l0aCgiPD8iKSkKLQkJCQl7Ci0JCQkJCXJlc3VsdCA9IC0xOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQkvLyBnZXQgYWxsIHBhcnRpdGlvbnMgZm9yIGN1cnJlbnQgbGluZQotCQkJCQlJVHlwZWRSZWdpb25bXSBwYXJ0aXRpb25zID0gbnVsbDsKLQotCQkJCQlwYXJ0aXRpb25zID0gaWRvYy5jb21wdXRlUGFydGl0aW9uaW5nKHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQgLSBzdGFydE9mZnNldCk7Ci0KLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJ0aXRpb25zLmxlbmd0aDsgKytpKQotCQkJCQl7Ci0JCQkJCQlTdHJpbmcgdHlwZSA9IHBhcnRpdGlvbnNbaV0uZ2V0VHlwZSgpOwotCQkJCQkJcmVzdWx0ID0gcGFydGl0aW9uc1tpXS5nZXRPZmZzZXQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKQotCQkJewotCQkJCXJlc3VsdCA9IC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbGl6YXRpb25EYXRhKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBkYXRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJLy8gbm90IHVzZWQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTb3VyY2VFZGl0aW5nVGV4dFRvb2xzKElTb3VyY2VFZGl0aW5nVGV4dFRvb2xzIHRvb2xzKQotCXsKLQkJLy8gbm90IHVzZWQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvbW9kZWwvWFNMQnJlYWtwb2ludEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvbW9kZWwvWFNMQnJlYWtwb2ludEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxOTE2YWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL21vZGVsL1hTTEJyZWFrcG9pbnRBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSVRvZ2dsZUJyZWFrcG9pbnRzVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci0KLS8qKgotICogQ3JlYXRlcyBhIHRvZ2dsZSBicmVha3BvaW50IGFkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIFhTTEJyZWFrcG9pbnRBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeQotewotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihPYmplY3QgYWRhcHRhYmxlT2JqZWN0LCBDbGFzcyBhZGFwdGVyVHlwZSkKLQl7Ci0JCWlmIChhZGFwdGFibGVPYmplY3QgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikKLQkJewotCQkJSVRleHRFZGl0b3IgZWRpdG9yUGFydCA9IChJVGV4dEVkaXRvcikgYWRhcHRhYmxlT2JqZWN0OwotCQkJSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSkgZWRpdG9yUGFydC5nZXRFZGl0b3JJbnB1dCgpLmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsKLQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKQotCQkJewotCQkJCVN0cmluZyBleHRlbnNpb24gPSByZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0JCQkJaWYgKGV4dGVuc2lvbiAhPSBudWxsICYmIGV4dGVuc2lvbi5lcXVhbHNJZ25vcmVDYXNlKCJ4c2wiKSkKLQkJCQl7Ci0JCQkJCXJldHVybiBuZXcgWFNMTGluZUJyZWFrcG9pbnRBZGFwdGVyKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkKLQl7Ci0JCXJldHVybiBuZXcgQ2xhc3NbXQotCQl7IElUb2dnbGVCcmVha3BvaW50c1RhcmdldC5jbGFzcyB9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9tb2RlbC9YU0xMaW5lQnJlYWtwb2ludEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9tb2RlbC9YU0xMaW5lQnJlYWtwb2ludEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM4MmMzMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvbW9kZWwvWFNMTGluZUJyZWFrcG9pbnRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSUJyZWFrcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JTGluZUJyZWFrcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JVG9nZ2xlQnJlYWtwb2ludHNUYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5tb2RlbC5JWFNMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLm1vZGVsLlhTTExpbmVCcmVha3BvaW50OwotCi1wdWJsaWMgY2xhc3MgWFNMTGluZUJyZWFrcG9pbnRBZGFwdGVyIGltcGxlbWVudHMgSVRvZ2dsZUJyZWFrcG9pbnRzVGFyZ2V0Ci17Ci0JcHVibGljIHZvaWQgdG9nZ2xlTGluZUJyZWFrcG9pbnRzKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IGdldEVkaXRvcihwYXJ0KTsKLQkJaWYgKHRleHRFZGl0b3IgIT0gbnVsbCkKLQkJewotCQkJSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSkgdGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpLmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsKLQkJCUlUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCWludCBsaW5lTnVtYmVyID0gdGV4dFNlbGVjdGlvbi5nZXRTdGFydExpbmUoKTsKLQkJCUlCcmVha3BvaW50W10gYnJlYWtwb2ludHMgPSBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnJlYWtwb2ludE1hbmFnZXIoKS5nZXRCcmVha3BvaW50cyhJWFNMQ29uc3RhbnRzLklEX1hTTF9ERUJVR19NT0RFTCk7Ci0JCQlmb3IgKElCcmVha3BvaW50IGJyZWFrcG9pbnQgOiBicmVha3BvaW50cykKLQkJCXsKLQkJCQlpZiAocmVzb3VyY2UuZXF1YWxzKGJyZWFrcG9pbnQuZ2V0TWFya2VyKCkuZ2V0UmVzb3VyY2UoKSkpCi0JCQkJewotCQkJCQlpZiAoKChJTGluZUJyZWFrcG9pbnQpIGJyZWFrcG9pbnQpLmdldExpbmVOdW1iZXIoKSA9PSAobGluZU51bWJlciArIDEpKQotCQkJCQl7Ci0JCQkJCQkvLyByZW1vdmUKLQkJCQkJCWJyZWFrcG9pbnQuZGVsZXRlKCk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkvLyBjcmVhdGUgbGluZSBicmVha3BvaW50IChkb2MgbGluZSBudW1iZXJzIHN0YXJ0IGF0IDApCi0JCQlYU0xMaW5lQnJlYWtwb2ludCBsaW5lQnJlYWtwb2ludCA9IG5ldyBYU0xMaW5lQnJlYWtwb2ludChyZXNvdXJjZSwgbGluZU51bWJlciArIDEsIDEsIDEpOwotCQkJRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJyZWFrcG9pbnRNYW5hZ2VyKCkuYWRkQnJlYWtwb2ludChsaW5lQnJlYWtwb2ludCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5Ub2dnbGVMaW5lQnJlYWtwb2ludHMoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0JewotCQlyZXR1cm4gZ2V0RWRpdG9yKHBhcnQpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZWRpdG9yIGJlaW5nIHVzZWQgdG8gZWRpdCBhIFhTTCBmaWxlLCBhc3NvY2lhdGVkIHdpdGggdGhlCi0JICogZ2l2ZW4gcGFydCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KLQkgKi8KLQlwcml2YXRlIElUZXh0RWRpdG9yIGdldEVkaXRvcihJV29ya2JlbmNoUGFydCBwYXJ0KQotCXsKLQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikKLQkJewotCQkJSVRleHRFZGl0b3IgZWRpdG9yUGFydCA9IChJVGV4dEVkaXRvcikgcGFydDsKLQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IChJUmVzb3VyY2UpIGVkaXRvclBhcnQuZ2V0RWRpdG9ySW5wdXQoKS5nZXRBZGFwdGVyKElSZXNvdXJjZS5jbGFzcyk7Ci0JCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkKLQkJCXsKLQkJCQlTdHJpbmcgZXh0ZW5zaW9uID0gcmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpOwotCQkJCS8vIFRPRE8gaGFuZGxlIG90aGVyIGZpbGUgZXh0ZW5zaW9ucy9jb250ZW50IHR5cGVzCi0JCQkJaWYgKGV4dGVuc2lvbiAhPSBudWxsICYmIGV4dGVuc2lvbi5lcXVhbHNJZ25vcmVDYXNlKCJ4c2wiKSkKLQkJCQl7Ci0JCQkJCXJldHVybiBlZGl0b3JQYXJ0OwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0b2dnbGVNZXRob2RCcmVha3BvaW50cyhJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuVG9nZ2xlTWV0aG9kQnJlYWtwb2ludHMoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0JewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgdG9nZ2xlV2F0Y2hwb2ludHMoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhblRvZ2dsZVdhdGNocG9pbnRzKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotCXsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9tb2RlbC9YU0xNb2RlbFByZXNlbnRhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL21vZGVsL1hTTE1vZGVsUHJlc2VudGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ZjgwZjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL21vZGVsL1hTTE1vZGVsUHJlc2VudGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklMaW5lQnJlYWtwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JRGVidWdNb2RlbFByZXNlbnRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JVmFsdWVEZXRhaWxMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLlhTTERlYnVnVUlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5YU0xEZWJ1Z1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLm1vZGVsLlhTTFZhcmlhYmxlOwotCi1wdWJsaWMgY2xhc3MgWFNMTW9kZWxQcmVzZW50YXRpb24gZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSURlYnVnTW9kZWxQcmVzZW50YXRpb24KLXsKLQlwcml2YXRlIEltYWdlIGxvY2FsSW1nOwotCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGUsIE9iamVjdCB2YWx1ZSkKLQl7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KQotCXsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBYU0xWYXJpYWJsZSkKLQkJewotCQkJWFNMVmFyaWFibGUgdmFyID0gKFhTTFZhcmlhYmxlKSBlbGVtZW50OwotCQkJaWYgKHZhci5nZXRTY29wZSgpLmVxdWFscyhYU0xWYXJpYWJsZS5MT0NBTF9TQ09QRSkpCi0JCQl7Ci0JCQkJaWYgKGxvY2FsSW1nID09IG51bGwpCi0JCQkJCWxvY2FsSW1nID0gWFNMRGVidWdVSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoIi9pY29ucy9sb2NhbHZhcmlhYmxlX29iai5naWYiKS5jcmVhdGVJbWFnZSgpOwotCQkJCXJldHVybiBsb2NhbEltZzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpCi0JewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLQl7Ci0JCWlmIChsb2NhbEltZyAhPSBudWxsKQotCQkJbG9jYWxJbWcuZGlzcG9zZSgpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY29tcHV0ZURldGFpbChJVmFsdWUgdmFsdWUsIElWYWx1ZURldGFpbExpc3RlbmVyIGxpc3RlbmVyKQotCXsKLQkJU3RyaW5nIGRldGFpbCA9ICIiOwotCQl0cnkKLQkJewotCQkJZGV0YWlsID0gdmFsdWUuZ2V0VmFsdWVTdHJpbmcoKTsKLQkJfQotCQljYXRjaCAoRGVidWdFeGNlcHRpb24gZSkKLQkJewotCQl9Ci0JCWxpc3RlbmVyLmRldGFpbENvbXB1dGVkKHZhbHVlLCBkZXRhaWwpOwotCX0KLQotCXB1YmxpYyBJRWRpdG9ySW5wdXQgZ2V0RWRpdG9ySW5wdXQoT2JqZWN0IGVsZW1lbnQpCi0JewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElGaWxlKQotCQl7Ci0JCQlyZXR1cm4gbmV3IEZpbGVFZGl0b3JJbnB1dCgoSUZpbGUpIGVsZW1lbnQpOwotCQl9Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUxpbmVCcmVha3BvaW50KQotCQl7Ci0JCQlyZXR1cm4gbmV3IEZpbGVFZGl0b3JJbnB1dCgoSUZpbGUpICgoSUxpbmVCcmVha3BvaW50KSBlbGVtZW50KS5nZXRNYXJrZXIoKS5nZXRSZXNvdXJjZSgpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVkaXRvcklkKElFZGl0b3JJbnB1dCBpbnB1dCwgT2JqZWN0IGVsZW1lbnQpCi0JewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElGaWxlIHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBJTGluZUJyZWFrcG9pbnQpCi0JCXsKLQkJCXJldHVybiBYU0xEZWJ1Z1VJQ29uc3RhbnRzLlhTTF9FRElUT1JfSUQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3ByZWZlcmVuY2VzL0FkZFByb2Nlc3NvckRpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3ByZWZlcmVuY2VzL0FkZFByb2Nlc3NvckRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjAwNThlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9wcmVmZXJlbmNlcy9BZGRQcm9jZXNzb3JEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5TdGF0dXNEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLlhTTERlYnVnVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLnByb2Nlc3Nvci5JbnN0YWxsU3RhbmRpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMucHJvY2Vzc29yLlByb2Nlc3Nvck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLklEZWJ1Z2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5JUHJvY2Vzc29ySW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5JUHJvY2Vzc29ySmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLklQcm9jZXNzb3JUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLlhTTFRSdW50aW1lOwotCi1wdWJsaWMgY2xhc3MgQWRkUHJvY2Vzc29yRGlhbG9nIGV4dGVuZHMgU3RhdHVzRGlhbG9nCi17Ci0JcHJpdmF0ZSBmaW5hbCBJbnN0YWxsU3RhbmRpbiBzdGFuZGluUHJvY2Vzc29yOwotCXByaXZhdGUgZmluYWwgSVByb2Nlc3NvclR5cGVbXSBwcm9jZXNzb3JUeXBlczsKLQlwcml2YXRlIElQcm9jZXNzb3JUeXBlIHNlbGVjdGVkUHJvY2Vzc29yVHlwZTsKLQlwcml2YXRlIENvbWJvVmlld2VyIHByb2Nlc3NvclR5cGVGaWVsZDsKLQlwcml2YXRlIFByb2Nlc3NvckxpYnJhcnlCbG9jayBmTGlicmFyeUJsb2NrOwotCXByaXZhdGUgVGV4dCBwcm9jZXNzb3JOYW1lRmllbGQ7Ci0JcHJpdmF0ZSBmaW5hbCBJU3RhdHVzW10gZlN0YXRpOwotCXByaXZhdGUgaW50IGZQcmV2SW5kZXggPSAtMTsKLQlwcml2YXRlIGZpbmFsIEluc3RhbGxlZFByb2Nlc3NvcnNCbG9jayBibG9jazsKLQlwcml2YXRlIGJvb2xlYW4gYWRkaW5nOwotCXByaXZhdGUgQnV0dG9uIHN1cHBvcnRzVmVyc29uMTBDaGVja2JveDsKLQlwcml2YXRlIEJ1dHRvbiBzdXBwb3J0c1ZlcnNvbjIwQ2hlY2tib3g7Ci0KLQlwdWJsaWMgQWRkUHJvY2Vzc29yRGlhbG9nKEluc3RhbGxlZFByb2Nlc3NvcnNCbG9jayBibG9jaywgU2hlbGwgcGFyZW50LCBJUHJvY2Vzc29yVHlwZVtdIHR5cGVzLCBJUHJvY2Vzc29ySW5zdGFsbCBpbnN0YWxsKQotCXsKLQkJc3VwZXIocGFyZW50KTsKLQkJc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuUkVTSVpFKTsKLQkJdGhpcy5ibG9jayA9IGJsb2NrOwotCQlmU3RhdGkgPSBuZXcgSVN0YXR1c1s1XTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmU3RhdGkubGVuZ3RoOyBpKyspCi0JCXsKLQkJCWZTdGF0aVtpXSA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQkJcHJvY2Vzc29yVHlwZXMgPSB0eXBlczsKLQkJc2VsZWN0ZWRQcm9jZXNzb3JUeXBlID0gaW5zdGFsbCAhPSBudWxsID8gaW5zdGFsbC5nZXRQcm9jZXNzb3JUeXBlKCkgOiB0eXBlc1swXTsKLQkJSW5zdGFsbFN0YW5kaW4gc3RhbmRpbiA9IG51bGw7Ci0JCWlmIChpbnN0YWxsID09IG51bGwpCi0JCXsKLQkJCWFkZGluZyA9IHRydWU7Ci0JCQlzdGFuZGluID0gbmV3IEluc3RhbGxTdGFuZGluKFhTTFRSdW50aW1lLmNyZWF0ZVVuaXF1ZVByb2Nlc3NvcklkKHNlbGVjdGVkUHJvY2Vzc29yVHlwZSksICIiLCBzZWxlY3RlZFByb2Nlc3NvclR5cGUuZ2V0SWQoKSwgbnVsbCwgbmV3IElQcm9jZXNzb3JKYXJbMF0pOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJc3RhbmRpbiA9IG5ldyBJbnN0YWxsU3RhbmRpbihpbnN0YWxsKTsKLQkJfQotCQlzdGFuZGluUHJvY2Vzc29yID0gc3RhbmRpbjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBuZXdTaGVsbCkKLQl7Ci0JCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKG5ld1NoZWxsKTsKLQkJLy8gVE9ETyBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwLi4uCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGlhbG9nRmllbGRzKENvbXBvc2l0ZSBwYXJlbnQpCi0JewotCQlHcmlkRGF0YSBnZDsKLQkJTGFiZWwgbGFiZWw7Ci0KLQkJbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoUHJvY2Vzc29yTWVzc2FnZXMuQWRkUHJvY2Vzc29yRGlhbG9nX3Byb2Nlc3Nvck5hbWUpOwotCQlwcm9jZXNzb3JOYW1lRmllbGQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShTV1QuTk9ORSwgU1dULk5PTkUsIGZhbHNlLCBmYWxzZSk7Ci0JCWdkLndpZHRoSGludCA9IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscyg1MCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJcHJvY2Vzc29yTmFtZUZpZWxkLnNldExheW91dERhdGEoZ2QpOwotCi0JCWxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KFByb2Nlc3Nvck1lc3NhZ2VzLkFkZFByb2Nlc3NvckRpYWxvZ19wcm9jZXNzb3JUeXBlKTsKLQkJcHJvY2Vzc29yVHlwZUZpZWxkID0gbmV3IENvbWJvVmlld2VyKHBhcmVudCwgU1dULlJFQURfT05MWSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJcHJvY2Vzc29yVHlwZUZpZWxkLmdldENvbWJvKCkuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXByb2Nlc3NvclR5cGVGaWVsZC5zZXRDb250ZW50UHJvdmlkZXIobmV3IElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKCkKLQkJewotCi0JCQlwcml2YXRlIE9iamVjdCBpbnB1dDsKLQotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpCi0JCQl7Ci0JCQkJcmV0dXJuIChJUHJvY2Vzc29yVHlwZVtdKSBpbnB1dDsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpCi0JCQl7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkKLQkJCXsKLQkJCQlpbnB1dCA9IG5ld0lucHV0OwotCQkJfQotCQl9KTsKLQkJcHJvY2Vzc29yVHlwZUZpZWxkLnNldExhYmVsUHJvdmlkZXIobmV3IExhYmVsUHJvdmlkZXIoKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkKLQkJCXsKLQkJCQlyZXR1cm4gKChJUHJvY2Vzc29yVHlwZSkgZWxlbWVudCkuZ2V0TGFiZWwoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoIlN1cHBvcnRlZCB2ZXJzaW9uczoiKTsKLQkJc3VwcG9ydHNWZXJzb24xMENoZWNrYm94ID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJc3VwcG9ydHNWZXJzb24xMENoZWNrYm94LnNldExheW91dERhdGEoZ2QpOwotCQlzdXBwb3J0c1ZlcnNvbjEwQ2hlY2tib3guc2V0VGV4dCgiWFNMVCAxLjAiKTsKLQotCQlsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJc3VwcG9ydHNWZXJzb24yMENoZWNrYm94ID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJc3VwcG9ydHNWZXJzb24yMENoZWNrYm94LnNldExheW91dERhdGEoZ2QpOwotCQlzdXBwb3J0c1ZlcnNvbjIwQ2hlY2tib3guc2V0VGV4dCgiWFNMVCAyLjAiKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGaWVsZExpc3RlbmVycygpCi0JewotCQlwcm9jZXNzb3JUeXBlRmllbGQuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkKLQkJewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0JCQl7Ci0JCQkJdXBkYXRlUHJvY2Vzc29yVHlwZSgpOwotCQkJfQotCQl9KTsKLQotCQlwcm9jZXNzb3JOYW1lRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkKLQkJewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKQotCQkJewotCQkJCXNldFByb2Nlc3Nvck5hbWVTdGF0dXModmFsaWRhdGVQcm9jZXNzb3JOYW1lKCkpOwotCQkJCXVwZGF0ZVN0YXR1c0xpbmUoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJc3VwcG9ydHNWZXJzb24xMENoZWNrYm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpCi0JCXsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotCQkJewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotCQkJewotCQkJCXNldFZlcnNpb25TdGF0dXModmFsaWRhdGVWZXJzaW9uU3RhdHVzKCkpOwotCQkJCXVwZGF0ZVN0YXR1c0xpbmUoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJc3VwcG9ydHNWZXJzb24yMENoZWNrYm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpCi0JCXsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotCQkJewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotCQkJewotCQkJCXNldFZlcnNpb25TdGF0dXModmFsaWRhdGVWZXJzaW9uU3RhdHVzKCkpOwotCQkJCXVwZGF0ZVN0YXR1c0xpbmUoKTsKLQkJCX0KLQkJfSk7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2Nlc3Nvck5hbWUoKQotCXsKLQkJcmV0dXJuIHByb2Nlc3Nvck5hbWVGaWVsZC5nZXRUZXh0KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgYW5jZXN0b3IpCi0JewotCQlDb21wb3NpdGUgcGFyZW50ID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShhbmNlc3Rvcik7Ci0JCSgoR3JpZExheW91dCkgcGFyZW50LmdldExheW91dCgpKS5udW1Db2x1bW5zID0gMzsKLS8vCQkoKEdyaWREYXRhKSBwYXJlbnQuZ2V0TGF5b3V0RGF0YSgpKS5oZWlnaHRIaW50ID0gNDAwOwotLy8JCSgoR3JpZERhdGEpIHBhcmVudC5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IDQwMDsKLQotCQljcmVhdGVEaWFsb2dGaWVsZHMocGFyZW50KTsKLQotCQlMYWJlbCBsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlsLnNldFRleHQoUHJvY2Vzc29yTWVzc2FnZXMuQWRkUHJvY2Vzc29yRGlhbG9nX2phcnMpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJZkxpYnJhcnlCbG9jayA9IG5ldyBQcm9jZXNzb3JMaWJyYXJ5QmxvY2sodGhpcyk7Ci0JCUNvbnRyb2wgYmxvY2sgPSBmTGlicmFyeUJsb2NrLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlibG9jay5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlpbml0aWFsaXplRmllbGRzKCk7Ci0JCWNyZWF0ZUZpZWxkTGlzdGVuZXJzKCk7Ci0JCWFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCQkKLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlUHJvY2Vzc29yVHlwZSgpCi0JewotCQlpbnQgc2VsSW5kZXggPSBwcm9jZXNzb3JUeXBlRmllbGQuZ2V0Q29tYm8oKS5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQlpZiAoc2VsSW5kZXggPT0gZlByZXZJbmRleCkKLQkJewotCQkJcmV0dXJuOwotCQl9Ci0JCWZQcmV2SW5kZXggPSBzZWxJbmRleDsKLQkJaWYgKHNlbEluZGV4ID49IDAgJiYgc2VsSW5kZXggPCBwcm9jZXNzb3JUeXBlcy5sZW5ndGgpCi0JCXsKLQkJCXNlbGVjdGVkUHJvY2Vzc29yVHlwZSA9IHByb2Nlc3NvclR5cGVzW3NlbEluZGV4XTsKLQkJfQotCQlmTGlicmFyeUJsb2NrLmluaXRpYWxpemVGcm9tKHN0YW5kaW5Qcm9jZXNzb3IsIHNlbGVjdGVkUHJvY2Vzc29yVHlwZSk7Ci0JCXVwZGF0ZVN0YXR1c0xpbmUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBjcmVhdGUoKQotCXsKLQkJc3VwZXIuY3JlYXRlKCk7Ci0JCXByb2Nlc3Nvck5hbWVGaWVsZC5zZXRGb2N1cygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRmllbGRzKCkKLQl7Ci0JCXByb2Nlc3NvclR5cGVGaWVsZC5zZXRJbnB1dChwcm9jZXNzb3JUeXBlcyk7Ci0JCWlmIChhZGRpbmcpCi0JCXsKLQkJCXByb2Nlc3Nvck5hbWVGaWVsZC5zZXRUZXh0KCIiKTsKLQkJCXByb2Nlc3NvclR5cGVGaWVsZC5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ocHJvY2Vzc29yVHlwZXNbMF0pKTsKLQkJCXN1cHBvcnRzVmVyc29uMTBDaGVja2JveC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQlmTGlicmFyeUJsb2NrLmluaXRpYWxpemVGcm9tKHN0YW5kaW5Qcm9jZXNzb3IsIHNlbGVjdGVkUHJvY2Vzc29yVHlwZSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwcm9jZXNzb3JUeXBlRmllbGQuZ2V0Q29tYm8oKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCXByb2Nlc3NvclR5cGVGaWVsZC5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc3RhbmRpblByb2Nlc3Nvci5nZXRQcm9jZXNzb3JUeXBlKCkpKTsKLQkJCXByb2Nlc3Nvck5hbWVGaWVsZC5zZXRUZXh0KHN0YW5kaW5Qcm9jZXNzb3IuZ2V0TmFtZSgpKTsKLQotCQkJc3VwcG9ydHNWZXJzb24xMENoZWNrYm94LnNldFNlbGVjdGlvbihzdGFuZGluUHJvY2Vzc29yLnN1cHBvcnRzKCIxLjAiKSk7Ci0JCQlzdXBwb3J0c1ZlcnNvbjIwQ2hlY2tib3guc2V0U2VsZWN0aW9uKHN0YW5kaW5Qcm9jZXNzb3Iuc3VwcG9ydHMoIjIuMCIpKTsKLQkJCWZMaWJyYXJ5QmxvY2suaW5pdGlhbGl6ZUZyb20oc3RhbmRpblByb2Nlc3Nvciwgc2VsZWN0ZWRQcm9jZXNzb3JUeXBlKTsKLQkJfQotCQlzZXRQcm9jZXNzb3JOYW1lU3RhdHVzKHZhbGlkYXRlUHJvY2Vzc29yTmFtZSgpKTsKLQkJdXBkYXRlU3RhdHVzTGluZSgpOwotCX0KLQotCXByaXZhdGUgSVN0YXR1cyB2YWxpZGF0ZVByb2Nlc3Nvck5hbWUoKQotCXsKLQkJSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQlTdHJpbmcgbmFtZSA9IHByb2Nlc3Nvck5hbWVGaWVsZC5nZXRUZXh0KCk7Ci0JCWlmIChuYW1lID09IG51bGwgfHwgbmFtZS50cmltKCkubGVuZ3RoKCkgPT0gMCkKLQkJewotCQkJc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLklORk8sIFhTTERlYnVnVUlQbHVnaW4uUExVR0lOX0lELCBJU3RhdHVzLk9LLCBQcm9jZXNzb3JNZXNzYWdlcy5BZGRQcm9jZXNzb3JEaWFsb2dfZW50ZXJOYW1lLCBudWxsKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWlmIChibG9jay5pc0R1cGxpY2F0ZU5hbWUobmFtZSkgJiYgKHN0YW5kaW5Qcm9jZXNzb3IgPT0gbnVsbCB8fCAhbmFtZS5lcXVhbHMoc3RhbmRpblByb2Nlc3Nvci5nZXROYW1lKCkpKSkKLQkJCXsKLQkJCQlzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFhTTERlYnVnVUlQbHVnaW4uUExVR0lOX0lELCBJU3RhdHVzLk9LLCBQcm9jZXNzb3JNZXNzYWdlcy5BZGRQcm9jZXNzb3JEaWFsb2dfZHVwbGljYXRlTmFtZSwgbnVsbCk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJLy8gSVN0YXR1cyBzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnZhbGlkYXRlTmFtZShuYW1lLAotCQkJCS8vIElSZXNvdXJjZS5GSUxFKTsKLQkJCQkvLyBpZiAoIXMuaXNPSygpKQotCQkJCS8vIHsKLQkJCQkvLyBzdGF0dXMuc2V0RXJyb3IoTWVzc2FnZUZvcm1hdC5mb3JtYXQoUHJvY2Vzc29yTWVzc2FnZXMuQWRkUHJvY2Vzc29yRGlhbG9nX1Byb2Nlc3Nvcl9uYW1lX211c3RfYmVfYV92YWxpZF9maWxlX25hbWUsCi0JCQkJLy8gbmV3IFN0cmluZ1tdCi0JCQkJLy8geyBzLmdldE1lc3NhZ2UoKSB9KSk7Ci0JCQkJLy8gfQotCQkJfQotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgdmFsaWRhdGVWZXJzaW9uU3RhdHVzKCkKLQl7Ci0JCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJaWYgKCFzdXBwb3J0c1ZlcnNvbjEwQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCkgJiYgIXN1cHBvcnRzVmVyc29uMjBDaGVja2JveC5nZXRTZWxlY3Rpb24oKSkKLQkJCXN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgWFNMRGVidWdVSVBsdWdpbi5QTFVHSU5fSUQsIElTdGF0dXMuT0ssICJQcm9jZXNzb3IgbXVzdCBzdXBwb3J0IGF0IGxlYXN0IG9uZSBYU0xUIHZlcnNpb24iLCBudWxsKTsKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTdGF0dXNMaW5lKCkKLQl7Ci0JCUlTdGF0dXMgbWF4ID0gbnVsbDsKLQkJZm9yIChJU3RhdHVzIGN1cnIgOiBmU3RhdGkpCi0JCXsKLQkJCWlmIChjdXJyLm1hdGNoZXMoSVN0YXR1cy5FUlJPUikpCi0JCQl7Ci0JCQkJdXBkYXRlU3RhdHVzKGN1cnIpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmIChtYXggPT0gbnVsbCB8fCBjdXJyLmdldFNldmVyaXR5KCkgPiBtYXguZ2V0U2V2ZXJpdHkoKSkKLQkJCXsKLQkJCQltYXggPSBjdXJyOwotCQkJfQotCQl9Ci0JCXVwZGF0ZVN0YXR1cyhtYXgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpCi0JewotCQlkb09rUHJlc3NlZCgpOwotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZG9Pa1ByZXNzZWQoKQotCXsKLQkJaWYgKGFkZGluZykKLQkJewotCQkJc2V0RmllbGRWYWx1ZXNUb1Byb2Nlc3NvcihzdGFuZGluUHJvY2Vzc29yKTsKLQkJCWJsb2NrLnByb2Nlc3NvckFkZGVkKHN0YW5kaW5Qcm9jZXNzb3IpOwotCQl9Ci0vLwkJZWxzZQotLy8JCQlzZXRGaWVsZFZhbHVlc1RvUHJvY2Vzc29yKChQcm9jZXNzb3JJbnN0YWxsKWVkaXRlZFByb2Nlc3Nvcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RmllbGRWYWx1ZXNUb1Byb2Nlc3NvcihJbnN0YWxsU3RhbmRpbiBwcm9jZXNzb3IpCi0JewotCQlwcm9jZXNzb3Iuc2V0TmFtZShwcm9jZXNzb3JOYW1lRmllbGQuZ2V0VGV4dCgpKTsKLQkJcHJvY2Vzc29yLnNldFByb2Nlc3NvclR5cGVJZChzZWxlY3RlZFByb2Nlc3NvclR5cGUuZ2V0SWQoKSk7Ci0KLQkJSURlYnVnZ2VyW10gZGVidWdnZXJzID0gWFNMVFJ1bnRpbWUuZ2V0RGVidWdnZXJzKCk7Ci0JCWZvciAoSURlYnVnZ2VyIGVsZW1lbnQgOiBkZWJ1Z2dlcnMpCi0JCXsKLQkJCWlmIChlbGVtZW50LmdldFByb2Nlc3NvclR5cGUoKS5lcXVhbHMoc2VsZWN0ZWRQcm9jZXNzb3JUeXBlKSkKLQkJCQlwcm9jZXNzb3Iuc2V0RGVidWdnZXJJZChlbGVtZW50LmdldElkKCkpOwotCQl9Ci0KLQkJU3RyaW5nIHN1cHBvcnRzID0gIiI7Ci0JCWlmIChzdXBwb3J0c1ZlcnNvbjEwQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCkpCi0JCXsKLQkJCXN1cHBvcnRzICs9ICIxLjAiOwotCQkJaWYgKHN1cHBvcnRzVmVyc29uMjBDaGVja2JveC5nZXRTZWxlY3Rpb24oKSkKLQkJCQlzdXBwb3J0cyArPSAiLCI7Ci0JCX0KLQkJaWYgKHN1cHBvcnRzVmVyc29uMjBDaGVja2JveC5nZXRTZWxlY3Rpb24oKSkKLQkJCXN1cHBvcnRzICs9ICIyLjAiOwotCQlwcm9jZXNzb3Iuc2V0U3VwcG9ydHMoc3VwcG9ydHMpOwotCQlmTGlicmFyeUJsb2NrLnBlcmZvcm1BcHBseShwcm9jZXNzb3IpOwotCX0KLQotCXByb3RlY3RlZCBGaWxlIGdldEFic29sdXRlRmlsZU9yRW1wdHkoU3RyaW5nIHBhdGgpCi0JewotCQlpZiAocGF0aCA9PSBudWxsIHx8IHBhdGgubGVuZ3RoKCkgPT0gMCkKLQkJewotCQkJcmV0dXJuIG5ldyBGaWxlKCIiKTsKLQkJfQotCQlyZXR1cm4gbmV3IEZpbGUocGF0aCkuZ2V0QWJzb2x1dGVGaWxlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFByb2Nlc3Nvck5hbWVTdGF0dXMoSVN0YXR1cyBzdGF0dXMpCi0JewotCQlmU3RhdGlbMF0gPSBzdGF0dXM7Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgZ2V0U3lzdGVtTGlicmFyeVN0YXR1cygpCi0JewotCQlyZXR1cm4gZlN0YXRpWzNdOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFN5c3RlbUxpYnJhcnlTdGF0dXMoSVN0YXR1cyBzdGF0dXMpCi0JewotCQlmU3RhdGlbM10gPSBzdGF0dXM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VmVyc2lvblN0YXR1cyhJU3RhdHVzIHN0YXR1cykKLQl7Ci0JCWZTdGF0aVsyXSA9IHN0YXR1czsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVCdXR0b25zRW5hYmxlU3RhdGUoSVN0YXR1cyBzdGF0dXMpCi0JewotCQlCdXR0b24gb2sgPSBnZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCk7Ci0JCWlmIChvayAhPSBudWxsICYmICFvay5pc0Rpc3Bvc2VkKCkpCi0JCQlvay5zZXRFbmFibGVkKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuT0spOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldEJ1dHRvbkxheW91dERhdGEoQnV0dG9uIGJ1dHRvbikKLQl7Ci0JCXN1cGVyLnNldEJ1dHRvbkxheW91dERhdGEoYnV0dG9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERpYWxvZ1NldHRpbmdzU2VjdGlvbk5hbWUoKQotCXsKLQkJcmV0dXJuICJBRERfUFJPQ0VTU09SX0RJQUxPR19TRUNUSU9OIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSURpYWxvZ1NldHRpbmdzIGdldERpYWxvZ0JvdW5kc1NldHRpbmdzKCkKLQl7Ci0vLwkJSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzID0gWFNMRGVidWdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLS8vCQlJRGlhbG9nU2V0dGluZ3Mgc2VjdGlvbiA9IHNldHRpbmdzLmdldFNlY3Rpb24oZ2V0RGlhbG9nU2V0dGluZ3NTZWN0aW9uTmFtZSgpKTsKLS8vCQlpZiAoc2VjdGlvbiA9PSBudWxsKQotLy8JCXsKLS8vCQkJc2VjdGlvbiA9IHNldHRpbmdzLmFkZE5ld1NlY3Rpb24oZ2V0RGlhbG9nU2V0dGluZ3NTZWN0aW9uTmFtZSgpKTsKLS8vCQl9Ci0vLwkJcmV0dXJuIHNlY3Rpb247Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9wcmVmZXJlbmNlcy9CYXNlUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9wcmVmZXJlbmNlcy9CYXNlUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM3ZTI5NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvcHJlZmVyZW5jZXMvQmFzZVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLQotcHVibGljIGNsYXNzIEJhc2VQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlCi17Ci0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkKLQl7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpCi0JewotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9wcmVmZXJlbmNlcy9GZWF0dXJlc0Jsb2NrLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvcHJlZmVyZW5jZXMvRmVhdHVyZXNCbG9jay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTIzYzJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9wcmVmZXJlbmNlcy9GZWF0dXJlc0Jsb2NrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZ1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbE1vZGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuQWJzdHJhY3RUYWJsZUJsb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuWFNMRGVidWdVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLlhTTERlYnVnVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuSUZlYXR1cmU7Ci0KLXB1YmxpYyBjbGFzcyBGZWF0dXJlc0Jsb2NrIGV4dGVuZHMgQWJzdHJhY3RUYWJsZUJsb2NrCi17Ci0JcHJpdmF0ZSBUYWJsZSB0YWJsZTsKLQlwcml2YXRlIFRhYmxlVmlld2VyIHRWaWV3ZXI7Ci0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGZlYXR1cmVWYWx1ZXM7Ci0JcHJpdmF0ZSBUZXh0IGRlc2NyaXB0aW9uVGV4dDsKLQlwcml2YXRlIERpYWxvZ1BhZ2UgZGlhbG9nUGFnZTsKLQotCXB1YmxpYyBGZWF0dXJlc0Jsb2NrKERpYWxvZ1BhZ2UgZGlhbG9nUGFnZSkKLQl7Ci0JCXRoaXMuZGlhbG9nUGFnZSA9IGRpYWxvZ1BhZ2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElEaWFsb2dTZXR0aW5ncyBnZXREaWFsb2dTZXR0aW5ncygpCi0JewotCQlyZXR1cm4gWFNMRGVidWdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFF1YWxpZmllcigpCi0JewotCQlyZXR1cm4gWFNMRGVidWdVSUNvbnN0YW50cy5GRUFUVVJFU19CTE9DSzsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVGFibGUgZ2V0VGFibGUoKQotCXsKLQkJcmV0dXJuIHRhYmxlOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLQl7Ci0JCXRhYmxlID0gbmV3IFRhYmxlKHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5WX1NDUk9MTCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJZ2Qud2lkdGhIaW50ID0gNDUwOwotCQl0YWJsZS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCi0JCVRhYmxlQ29sdW1uIGMxID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWMxLnNldFdpZHRoKDE1MCk7Ci0JCWMxLnNldFJlc2l6YWJsZSh0cnVlKTsKLQkJYzEuc2V0VGV4dCgiRmVhdHVyZSIpOwotCi0JCVRhYmxlQ29sdW1uIGMyID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWMyLnNldFdpZHRoKDUwKTsKLQkJYzIuc2V0UmVzaXphYmxlKHRydWUpOwotCQljMi5zZXRUZXh0KCJUeXBlIik7Ci0KLQkJVGFibGVDb2x1bW4gYzMgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJYzMuc2V0V2lkdGgoMjUwKTsKLQkJYzMuc2V0UmVzaXphYmxlKHRydWUpOwotCQljMy5zZXRUZXh0KCJWYWx1ZSIpOwotCi0JCXRWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIodGFibGUpOwotCQl0Vmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIoKQotCQl7Ci0KLQkJCXByaXZhdGUgSUZlYXR1cmVbXSBmZWF0dXJlczsKLQotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpCi0JCQl7Ci0JCQkJcmV0dXJuIGZlYXR1cmVzOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLQkJCXsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KQotCQkJewotCQkJCWZlYXR1cmVzID0gKElGZWF0dXJlW10pIG5ld0lucHV0OwotCQkJfQotCQl9KTsKLQkJdFZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBJVGFibGVMYWJlbFByb3ZpZGVyKCkKLQkJewotCi0JCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkKLQkJCXsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpCi0JCQl7Ci0JCQkJSUZlYXR1cmUgZmVhdHVyZSA9IChJRmVhdHVyZSkgZWxlbWVudDsKLQkJCQlzd2l0Y2ggKGNvbHVtbkluZGV4KQotCQkJCXsKLQkJCQkJY2FzZSAwOgotCQkJCQkJcmV0dXJuIHJlbW92ZVVSSShmZWF0dXJlLmdldFVSSSgpKTsKLQkJCQkJY2FzZSAxOgotCQkJCQkJcmV0dXJuIGZlYXR1cmUuZ2V0VHlwZSgpOwotCQkJCQljYXNlIDI6Ci0JCQkJCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBmZWF0dXJlVmFsdWVzLmdldChmZWF0dXJlLmdldFVSSSgpKTsKLQkJCQkJCXJldHVybiB2YWx1ZSA9PSBudWxsID8gIiIgOiB2YWx1ZTsKLQkJCQl9Ci0JCQkJcmV0dXJuICIhISI7Ci0JCQl9Ci0KLQkJCXByaXZhdGUgU3RyaW5nIHJlbW92ZVVSSShTdHJpbmcgdXJpKQotCQkJewotCQkJCWludCBpbmRleCA9IHVyaS5sYXN0SW5kZXhPZignLycpOwotCQkJCWlmIChpbmRleCA+IDApCi0JCQkJCXJldHVybiB1cmkuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0JCQkJcmV0dXJuIHVyaTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikKLQkJCXsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpCi0JCQl7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KQotCQkJewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikKLQkJCXsKLQkJCX0KLQotCQl9KTsKLQkJdFZpZXdlci5zZXRDb2x1bW5Qcm9wZXJ0aWVzKG5ldyBTdHJpbmdbXQotCQl7ICJuYW1lIiwgInR5cGUiLCAidmFsdWUiIH0pOwotCQlmaW5hbCBTdHJpbmdbXSB2YWxpZCA9IG5ldyBTdHJpbmdbXXtudWxsfTsKLQkJdFZpZXdlci5zZXRDZWxsTW9kaWZpZXIobmV3IElDZWxsTW9kaWZpZXIoKQotCQl7Ci0JCQlwdWJsaWMgYm9vbGVhbiBjYW5Nb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkKLQkJCXsKLQkJCQlyZXR1cm4gInZhbHVlIi5lcXVhbHMocHJvcGVydHkpOwotCQkJfQotCi0JCQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpCi0JCQl7Ci0JCQkJSUZlYXR1cmUgZmVhdHVyZSA9IChJRmVhdHVyZSkgZWxlbWVudDsKLQkJCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBmZWF0dXJlVmFsdWVzLmdldChmZWF0dXJlLmdldFVSSSgpKTsKLQkJCQlyZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICIiIDogdmFsdWU7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgdmFsdWUpCi0JCQl7Ci0JCQkJSXRlbSBpdGVtID0gKEl0ZW0pIGVsZW1lbnQ7Ci0JCQkJSUZlYXR1cmUgZmVhdHVyZSA9IChJRmVhdHVyZSkgaXRlbS5nZXREYXRhKCk7Ci0JCQkJaWYgKHZhbHVlID09IG51bGwgfHwgIiIuZXF1YWxzKHZhbHVlKSkKLQkJCQkJZmVhdHVyZVZhbHVlcy5yZW1vdmUoZmVhdHVyZS5nZXRVUkkoKSk7Ci0JCQkJZWxzZQotCQkJCQlmZWF0dXJlVmFsdWVzLnB1dChmZWF0dXJlLmdldFVSSSgpLCAoU3RyaW5nKXZhbHVlKTsJCQkJCi0JCQkJc2V0RXJyb3JNZXNzYWdlKHZhbGlkWzBdKTsKLQkJCQl0Vmlld2VyLnVwZGF0ZShmZWF0dXJlLCBudWxsKTsKLQkJCX0KLQkJfSk7Ci0JCXRWaWV3ZXIuc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgZTEsIE9iamVjdCBlMikKLQkJCXsKLQkJCQlJRmVhdHVyZSBmZWF0dXJlMSA9IChJRmVhdHVyZSkgZTE7Ci0JCQkJSUZlYXR1cmUgZmVhdHVyZTIgPSAoSUZlYXR1cmUpIGUyOwotCQkJCXJldHVybiBmZWF0dXJlMS5nZXRVUkkoKS5jb21wYXJlVG8oZmVhdHVyZTIuZ2V0VVJJKCkpOwotCQkJfQotCQl9KTsKLQotCQlUZXh0Q2VsbEVkaXRvciBlZGl0b3IgPSBuZXcgVGV4dENlbGxFZGl0b3IodGFibGUpOwotCQllZGl0b3Iuc2V0VmFsaWRhdG9yKG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpCi0JCXsKLQotCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKE9iamVjdCB2YWx1ZSkKLQkJCXsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJSUZlYXR1cmUgZmVhdHVyZSA9IChJRmVhdHVyZSkgc2VsLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCUlTdGF0dXMgdmFsaWRTdGF0dXMgPSBmZWF0dXJlLnZhbGlkYXRlVmFsdWUoKFN0cmluZykgdmFsdWUpOwotCQkJCWlmICh2YWx1ZSA9PSBudWxsIHx8ICIiLmVxdWFscyh2YWx1ZSkpCi0JCQkJCXZhbGlkWzBdID0gbnVsbDsKLQkJCQllbHNlIGlmICh2YWxpZFN0YXR1cyAhPSBudWxsICYmIHZhbGlkU3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikKLQkJCQkJdmFsaWRbMF0gPSB2YWxpZFN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0JCQkJZWxzZQotCQkJCQl2YWxpZFswXSA9IG51bGw7Ci0JCQkJcmV0dXJuIHZhbGlkWzBdOwotCQkJfQotCQl9KTsKLQotCQlDZWxsRWRpdG9yW10gZWRpdG9ycyA9IG5ldyBDZWxsRWRpdG9yW10KLQkJeyBudWxsLCBudWxsLCBlZGl0b3IgfTsKLQkJdFZpZXdlci5zZXRDZWxsRWRpdG9ycyhlZGl0b3JzKTsKLQkJdFZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKQotCQl7Ci0KLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KQotCQkJewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQkJCWlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkgIT0gbnVsbCkKLQkJCQkJdGV4dCA9ICgoSUZlYXR1cmUpIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSkuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCQlkZXNjcmlwdGlvblRleHQuc2V0VGV4dCh0ZXh0ID09IG51bGwgPyAiIiA6IHRleHQpOwotCQkJfQotCQl9KTsKLQotCQlyZXN0b3JlQ29sdW1uU2V0dGluZ3MoKTsKLQotCQlkZXNjcmlwdGlvblRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5XUkFQIHwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkgfCBTV1QuVl9TQ1JPTEwpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULk5PTkUsIHRydWUsIGZhbHNlKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlnZC5oZWlnaHRIaW50ID0gODA7Ci0JCWRlc2NyaXB0aW9uVGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRJbnB1dChJRmVhdHVyZVtdIGlucHV0KQotCXsKLQkJdFZpZXdlci5zZXRJbnB1dChpbnB1dCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RmVhdHVyZVZhbHVlcyhNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcCkKLQl7Ci0JCXRoaXMuZmVhdHVyZVZhbHVlcyA9IG1hcDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikKLQl7Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybUFwcGx5KElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlndXJhdGlvbikKLQl7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdHMoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uKQotCXsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0RXJyb3JNZXNzYWdlKFN0cmluZyBlcnJvck1lc3NhZ2UpCi0JewotCQlkaWFsb2dQYWdlLnNldEVycm9yTWVzc2FnZShlcnJvck1lc3NhZ2UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3ByZWZlcmVuY2VzL0ZlYXR1cmVzUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9wcmVmZXJlbmNlcy9GZWF0dXJlc1ByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NjNlOTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3ByZWZlcmVuY2VzL0ZlYXR1cmVzUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5YU0xEZWJ1Z1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLklGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLklQcm9jZXNzb3JJbnN0YWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLklQcm9jZXNzb3JUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLlhTTFRSdW50aW1lOwotCi1wdWJsaWMgY2xhc3MgRmVhdHVyZXNQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlCi17Ci0JcHJpdmF0ZSBmaW5hbCBNYXA8SVByb2Nlc3NvclR5cGUsIE1hcDxTdHJpbmcsIFN0cmluZz4+IHR5cGVGZWF0dXJlTWFwID0gbmV3IEhhc2hNYXA8SVByb2Nlc3NvclR5cGUsIE1hcDxTdHJpbmcsIFN0cmluZz4+KCk7Ci0JcHJpdmF0ZSBDb21ib1ZpZXdlciBjVmlld2VyOwotCXByaXZhdGUgRmVhdHVyZXNCbG9jayBmZWF0dXJlc0Jsb2NrOwotCi0JcHVibGljIEZlYXR1cmVzUHJlZmVyZW5jZVBhZ2UoKQotCXsKLQkJc3VwZXIoKTsKLQkJLy8gb25seSB1c2VkIHdoZW4gcGFnZSBpcyBzaG93biBwcm9ncmFtYXRpY2FsbHkKLQkJc2V0VGl0bGUoIlByb2Nlc3NvciBGZWF0dXJlcyIpOwotCQlzZXREZXNjcmlwdGlvbigiU2V0IGRlZmF1bHQgdmFsdWVzIGZvciBpbnN0YWxsZWQgcHJvY2Vzc29yIHR5cGVzIik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkKLQl7Ci0JCXBhcmVudCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQlwYXJlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKFNXVC5OT05FLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpOwotCQlsYWJlbC5zZXRUZXh0KCJQcm9jZXNzb3IgVHlwZTogIik7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCi0JCUNvbWJvIGNvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULlJFQURfT05MWSB8IFNXVC5TSU5HTEUpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShTV1QuTk9ORSwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKTsKLQkJY29tYm8uc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJY1ZpZXdlciA9IG5ldyBDb21ib1ZpZXdlcihjb21ibyk7Ci0JCWNWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcigpCi0JCXsKLQotCQkJcHJpdmF0ZSBJUHJvY2Vzc29yVHlwZVtdIHR5cGVzOwotCi0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkKLQkJCXsKLQkJCQlyZXR1cm4gdHlwZXM7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotCQkJewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpCi0JCQl7Ci0JCQkJdHlwZXMgPSAoSVByb2Nlc3NvclR5cGVbXSkgbmV3SW5wdXQ7Ci0JCQl9Ci0JCX0pOwotCQljVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IExhYmVsUHJvdmlkZXIoKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkKLQkJCXsKLQkJCQlJUHJvY2Vzc29yVHlwZSB0eXBlID0gKElQcm9jZXNzb3JUeXBlKSBlbGVtZW50OwotCQkJCXJldHVybiB0eXBlLmdldExhYmVsKCk7Ci0JCQl9Ci0JCX0pOwotCQljVmlld2VyLnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpCi0JCQl7Ci0JCQkJSVByb2Nlc3NvclR5cGUgdHlwZTEgPSAoSVByb2Nlc3NvclR5cGUpIGUxOwotCQkJCUlQcm9jZXNzb3JUeXBlIHR5cGUyID0gKElQcm9jZXNzb3JUeXBlKSBlMjsKLQkJCQlyZXR1cm4gdHlwZTEuZ2V0TGFiZWwoKS5jb21wYXJlVG8odHlwZTIuZ2V0TGFiZWwoKSk7Ci0JCQl9Ci0JCX0pOwotCQljVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpCi0JCXsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KQotCQkJewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJSVByb2Nlc3NvclR5cGUgdHlwZSA9IChJUHJvY2Vzc29yVHlwZSkgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCWlmICh0eXBlICE9IG51bGwpCi0JCQkJewotCQkJCQlmZWF0dXJlc0Jsb2NrLnNldEZlYXR1cmVWYWx1ZXMoKE1hcDxTdHJpbmcsIFN0cmluZz4pIHR5cGVGZWF0dXJlTWFwLmdldCh0eXBlKSk7Ci0JCQkJCWZlYXR1cmVzQmxvY2suc2V0SW5wdXQodHlwZS5nZXRGZWF0dXJlcygpKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJZmVhdHVyZXNCbG9jay5zZXRGZWF0dXJlVmFsdWVzKG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpKTsKLQkJCQkJZmVhdHVyZXNCbG9jay5zZXRJbnB1dChuZXcgSUZlYXR1cmVbMF0pOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCWNWaWV3ZXIuYWRkRmlsdGVyKG5ldyBWaWV3ZXJGaWx0ZXIoKQotCQl7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnRFbGVtZW50LCBPYmplY3QgZWxlbWVudCkKLQkJCXsKLQkJCQlJUHJvY2Vzc29yVHlwZSB0eXBlID0gKElQcm9jZXNzb3JUeXBlKSBlbGVtZW50OwotCQkJCXJldHVybiAhdHlwZS5lcXVhbHMoWFNMVFJ1bnRpbWUuZ2V0UHJvY2Vzc29yVHlwZShYU0xUUnVudGltZS5KUkVfREVGQVVMVF9QUk9DRVNTT1JfVFlQRV9JRCkpOwotCQkJfQotCi0JCX0pOwotCi0JCWZlYXR1cmVzQmxvY2sgPSBuZXcgRmVhdHVyZXNCbG9jayh0aGlzKTsKLQkJZmVhdHVyZXNCbG9jay5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0KLQkJc2V0SW5wdXQoKTsKLQotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRJbnB1dCgpCi0JewotCQlJUHJvY2Vzc29yVHlwZVtdIHR5cGVzID0gWFNMVFJ1bnRpbWUuZ2V0UHJvY2Vzc29yVHlwZXMoKTsKLQkJZm9yIChJUHJvY2Vzc29yVHlwZSB0eXBlIDogdHlwZXMpCi0JCXsKLQkJCXR5cGVGZWF0dXJlTWFwLnB1dCh0eXBlLCB0eXBlLmdldEZlYXR1cmVWYWx1ZXMoKSk7Ci0JCX0KLQkJY1ZpZXdlci5zZXRJbnB1dChYU0xUUnVudGltZS5nZXRQcm9jZXNzb3JUeXBlcygpKTsKLQkJY1ZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZ2V0SW5pdGlhbFR5cGUoKSksIHRydWUpOwotCX0KLQkKLQlzdGF0aWMgSVByb2Nlc3NvclR5cGUgZ2V0SW5pdGlhbFR5cGUoKQotCXsKLQkJSVByb2Nlc3Nvckluc3RhbGwgaW5zdGFsbCA9IFhTTFRSdW50aW1lLmdldERlZmF1bHRQcm9jZXNzb3IoKTsKLQkJaWYgKGluc3RhbGwgIT0gWFNMVFJ1bnRpbWUuZ2V0SlJFRGVmYXVsdFByb2Nlc3NvcigpKQotCQkJcmV0dXJuIGluc3RhbGwuZ2V0UHJvY2Vzc29yVHlwZSgpOwotCQlyZXR1cm4gWFNMVFJ1bnRpbWUuZ2V0UHJvY2Vzc29yVHlwZXNFeGNsSlJFRGVmYXVsdCgpWzBdOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpCi0JewotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKQotCXsKLQkJSVByb2Nlc3NvclR5cGVbXSB0eXBlcyA9IFhTTFRSdW50aW1lLmdldFByb2Nlc3NvclR5cGVzKCk7Ci0JCWZvciAoSVByb2Nlc3NvclR5cGUgdHlwZSA6IHR5cGVzKQotCQl7Ci0JCQl0eXBlRmVhdHVyZU1hcC5wdXQodHlwZSwgbmV3IEhhc2hNYXA8U3RyaW5nLFN0cmluZz4oKSk7Ci0JCX0KLQkJY1ZpZXdlci5zZXRJbnB1dChYU0xUUnVudGltZS5nZXRQcm9jZXNzb3JUeXBlcygpKTsKLQkJY1ZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZ2V0SW5pdGlhbFR5cGUoKSksIHRydWUpOwotCQkKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkKLQl7Ci0JCWZlYXR1cmVzQmxvY2suc2F2ZUNvbHVtblNldHRpbmdzKCk7Ci0JCWZpbmFsIGJvb2xlYW5bXSBvayA9IG5ldyBib29sZWFuWzFdOwotCQl0cnkKLQkJewotCQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpCi0JCQl7Ci0JCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCi0JCQkJewotCQkJCQl0cnkKLQkJCQkJewotCQkJCQkJWFNMVFJ1bnRpbWUuc2F2ZUZlYXR1cmVQcmVmZXJlbmNlcyh0eXBlRmVhdHVyZU1hcCxtb25pdG9yKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotCQkJCQl7Ci0JCQkJCQlYU0xEZWJ1Z1VJUGx1Z2luLmxvZyhlKTsKLQkJCQkJfQotCQkJCQlva1swXSA9ICFtb25pdG9yLmlzQ2FuY2VsZWQoKTsKLQkJCQl9Ci0JCQl9OwotCQkJWFNMRGVidWdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCkuYnVzeUN1cnNvcldoaWxlKHJ1bm5hYmxlKTsKLQkJfQotCQljYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQlYU0xEZWJ1Z1VJUGx1Z2luLmxvZyhlKTsKLQkJfQotCQljYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkKLQkJewotCQkJWFNMRGVidWdVSVBsdWdpbi5sb2coZSk7Ci0JCX0KLQkJcmV0dXJuIG9rWzBdOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9wcmVmZXJlbmNlcy9JbnN0YWxsZWRQcm9jZXNzb3JzQmxvY2suamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9wcmVmZXJlbmNlcy9JbnN0YWxsZWRQcm9jZXNzb3JzQmxvY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM0YmI3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvcHJlZmVyZW5jZXMvSW5zdGFsbGVkUHJvY2Vzc29yc0Jsb2NrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRG91YmxlQ2xpY2tMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLkFic3RyYWN0VGFibGVCbG9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLlhTTERlYnVnVUlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5YU0xEZWJ1Z1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5wcm9jZXNzb3IuSW5zdGFsbFN0YW5kaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLnByb2Nlc3Nvci5Qcm9jZXNzb3JEZXRhaWxzRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5wcm9jZXNzb3IuUHJvY2Vzc29yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuSVByb2Nlc3Nvckluc3RhbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuSVByb2Nlc3NvclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuWFNMVFJ1bnRpbWU7Ci0KLXB1YmxpYyBjbGFzcyBJbnN0YWxsZWRQcm9jZXNzb3JzQmxvY2sgZXh0ZW5kcyBBYnN0cmFjdFRhYmxlQmxvY2sgaW1wbGVtZW50cyBJU2VsZWN0aW9uUHJvdmlkZXIKLXsKLQlwcml2YXRlIENvbXBvc2l0ZSBmQ29udHJvbDsKLQlwcml2YXRlIGZpbmFsIExpc3Q8SVByb2Nlc3Nvckluc3RhbGw+IHByb2Nlc3NvcnMgPSBuZXcgQXJyYXlMaXN0PElQcm9jZXNzb3JJbnN0YWxsPigpOwotCXByaXZhdGUgQ2hlY2tib3hUYWJsZVZpZXdlciB0YWJsZVZpZXdlcjsKLQlwcml2YXRlIEJ1dHRvbiBmQWRkQnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIGZSZW1vdmVCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gZkVkaXRCdXR0b247Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0ZW5lckxpc3QgZlNlbGVjdGlvbkxpc3RlbmVycyA9IG5ldyBMaXN0ZW5lckxpc3QoKTsKLQlwcml2YXRlIElTZWxlY3Rpb24gZlByZXZTZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigpOwotCi0JcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpCi0JewotCQlmU2VsZWN0aW9uTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpCi0JewotCQlmU2VsZWN0aW9uTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkKLQl7Ci0JCXJldHVybiBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbih0YWJsZVZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKQotCXsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCQl7Ci0JCQlpZiAoIXNlbGVjdGlvbi5lcXVhbHMoZlByZXZTZWxlY3Rpb24pKQotCQkJewotCQkJCWZQcmV2U2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCQkJCU9iamVjdCBqcmUgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCWlmIChqcmUgPT0gbnVsbCkKLQkJCQl7Ci0JCQkJCXRhYmxlVmlld2VyLnNldENoZWNrZWRFbGVtZW50cyhuZXcgT2JqZWN0WzBdKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJdGFibGVWaWV3ZXIuc2V0Q2hlY2tlZEVsZW1lbnRzKG5ldyBPYmplY3RbXQotCQkJCQl7IGpyZSB9KTsKLQkJCQkJdGFibGVWaWV3ZXIucmV2ZWFsKGpyZSk7Ci0JCQkJfQotCQkJCWZpcmVTZWxlY3Rpb25DaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBhbmNlc3RvcikKLQl7Ci0KLQkJQ29tcG9zaXRlIHBhcmVudCA9IG5ldyBDb21wb3NpdGUoYW5jZXN0b3IsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlwYXJlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUZvbnQgZm9udCA9IGFuY2VzdG9yLmdldEZvbnQoKTsKLQkJcGFyZW50LnNldEZvbnQoZm9udCk7Ci0JCWZDb250cm9sID0gcGFyZW50OwotCi0JCUdyaWREYXRhIGRhdGE7Ci0KLQkJTGFiZWwgdGFibGVMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJdGFibGVMYWJlbC5zZXRUZXh0KCJJbnN0YWxsZWQgSmF2YSBYU0xUIFByb2Nlc3NvcnM6Iik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXRhYmxlTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJdGFibGVMYWJlbC5zZXRGb250KGZvbnQpOwotCi0JCVRhYmxlIGZUYWJsZSA9IG5ldyBUYWJsZShwYXJlbnQsIFNXVC5DSEVDSyB8IFNXVC5CT1JERVIgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuVl9TQ1JPTEwpOwotCi0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS53aWR0aEhpbnQgPSA0NTA7Ci0JCWZUYWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlmVGFibGUuc2V0Rm9udChmb250KTsKLQotCQlmVGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJZlRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQotCQlUYWJsZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRhYmxlQ29sdW1uKGZUYWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4xLnNldFdpZHRoKDE4MCk7Ci0JCWNvbHVtbjEuc2V0UmVzaXphYmxlKHRydWUpOwotCQljb2x1bW4xLnNldFRleHQoIk5hbWUiKTsKLQkJY29sdW1uMS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLQkJCXsKLQkJCQlzb3J0QnlOYW1lKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCVRhYmxlQ29sdW1uIGNvbHVtbjIgPSBuZXcgVGFibGVDb2x1bW4oZlRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbjIuc2V0V2lkdGgoMTAwKTsKLQkJY29sdW1uMi5zZXRSZXNpemFibGUodHJ1ZSk7Ci0JCWNvbHVtbjIuc2V0VGV4dCgiVHlwZSIpOwotCQljb2x1bW4yLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotCQkJewotCQkJCXNvcnRCeVR5cGUoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJVGFibGVDb2x1bW4gY29sdW1uMyA9IG5ldyBUYWJsZUNvbHVtbihmVGFibGUsIFNXVC5OT05FKTsKLQkJY29sdW1uMy5zZXRXaWR0aCg5MCk7Ci0JCWNvbHVtbjMuc2V0UmVzaXphYmxlKHRydWUpOwotCQljb2x1bW4zLnNldFRleHQoIlhTTFQgVmVyc2lvbnMiKTsKLQkJY29sdW1uMy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLQkJCXsKLQkJCQlzb3J0QnlWZXJzaW9uKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCVRhYmxlQ29sdW1uIGNvbHVtbjQgPSBuZXcgVGFibGVDb2x1bW4oZlRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbjQuc2V0V2lkdGgoMTEwKTsKLQkJY29sdW1uNC5zZXRSZXNpemFibGUodHJ1ZSk7Ci0JCWNvbHVtbjQuc2V0VGV4dCgiRGVidWdnZXIiKTsKLQkJY29sdW1uNC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLQkJCXsKLQkJCQlzb3J0QnlWZXJzaW9uKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXRhYmxlVmlld2VyID0gbmV3IENoZWNrYm94VGFibGVWaWV3ZXIoZlRhYmxlKTsKLQkJdGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgVk1MYWJlbFByb3ZpZGVyKCkpOwotCQl0YWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFByb2Nlc3NvcnNDb250ZW50UHJvdmlkZXIoKSk7Ci0KLQkJdGFibGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkKLQkJewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZ0KQotCQkJewotCQkJCWVuYWJsZUJ1dHRvbnMoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJdGFibGVWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkKLQkJewotCQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkKLQkJCXsKLQkJCQlpZiAoZXZlbnQuZ2V0Q2hlY2tlZCgpKQotCQkJCXsKLQkJCQkJc2V0Q2hlY2tlZEluc3RhbGwoKElQcm9jZXNzb3JJbnN0YWxsKSBldmVudC5nZXRFbGVtZW50KCkpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlzZXRDaGVja2VkSW5zdGFsbChudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCXRhYmxlVmlld2VyLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIobmV3IElEb3VibGVDbGlja0xpc3RlbmVyKCkKLQkJewotCQkJcHVibGljIHZvaWQgZG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudCBlKQotCQkJewotCQkJCWlmICghdGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkuaXNFbXB0eSgpKQotCQkJCXsKLQkJCQkJZWRpdFByb2Nlc3NvcigpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCWZUYWJsZS5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBldmVudCkKLQkJCXsKLQkJCQlpZiAoZXZlbnQuY2hhcmFjdGVyID09IFNXVC5ERUwgJiYgZXZlbnQuc3RhdGVNYXNrID09IDApCi0JCQkJewotCQkJCQlyZW1vdmVQcm9jZXNzb3JzKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlDb21wb3NpdGUgYnV0dG9ucyA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWJ1dHRvbnMuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlidXR0b25zLnNldExheW91dChsYXlvdXQpOwotCQlidXR0b25zLnNldEZvbnQoZm9udCk7Ci0KLQkJZkFkZEJ1dHRvbiA9IGNyZWF0ZVB1c2hCdXR0b24oYnV0dG9ucywgIkFkZCIpOwotCQlmQWRkQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpCi0JCXsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2dCkKLQkJCXsKLQkJCQlhZGRQcm9jZXNzb3IoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJZkVkaXRCdXR0b24gPSBjcmVhdGVQdXNoQnV0dG9uKGJ1dHRvbnMsICJFZGl0Iik7Ci0JCWZFZGl0QnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpCi0JCXsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2dCkKLQkJCXsKLQkJCQllZGl0UHJvY2Vzc29yKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWZSZW1vdmVCdXR0b24gPSBjcmVhdGVQdXNoQnV0dG9uKGJ1dHRvbnMsICJSZW1vdmUiKTsKLQkJZlJlbW92ZUJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKQotCQl7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldnQpCi0JCQl7Ci0JCQkJcmVtb3ZlUHJvY2Vzc29ycygpOwotCQkJfQotCQl9KTsKLQotCQkvLyBjb3BpZWQgZnJvbSBMaXN0RGlhbG9nRmllbGQuQ3JlYXRlU2VwYXJhdG9yKCkKLQkJTGFiZWwgc2VwYXJhdG9yID0gbmV3IExhYmVsKGJ1dHRvbnMsIFNXVC5OT05FKTsKLQkJc2VwYXJhdG9yLnNldFZpc2libGUoZmFsc2UpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ2QudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5CRUdJTk5JTkc7Ci0JCWdkLmhlaWdodEhpbnQgPSA0OwotCQlzZXBhcmF0b3Iuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJZmlsbFdpdGhXb3Jrc3BhY2VQcm9jZXNzb3JzKCk7Ci0JCWVuYWJsZUJ1dHRvbnMoKTsKLQotCQlyZXN0b3JlQ29sdW1uU2V0dGluZ3MoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaWxsV2l0aFdvcmtzcGFjZVByb2Nlc3NvcnMoKQotCXsKLQkJTGlzdDxJbnN0YWxsU3RhbmRpbj4gc3RhbmRpbnMgPSBuZXcgQXJyYXlMaXN0PEluc3RhbGxTdGFuZGluPigpOwotCQlJUHJvY2Vzc29yVHlwZVtdIHR5cGVzID0gWFNMVFJ1bnRpbWUuZ2V0UHJvY2Vzc29yVHlwZXMoKTsKLQkJZm9yIChJUHJvY2Vzc29yVHlwZSB0eXBlIDogdHlwZXMpCi0JCXsKLQkJCUlQcm9jZXNzb3JJbnN0YWxsW10gaW5zdGFsbHMgPSBYU0xUUnVudGltZS5nZXRQcm9jZXNzb3JzKHR5cGUuZ2V0SWQoKSk7Ci0JCQlmb3IgKElQcm9jZXNzb3JJbnN0YWxsIGluc3RhbGwgOiBpbnN0YWxscykKLQkJCXsKLQkJCQlzdGFuZGlucy5hZGQobmV3IEluc3RhbGxTdGFuZGluKGluc3RhbGwpKTsKLQkJCX0KLQkJfQotCQlzZXRQcm9jZXNzb3JzKChJUHJvY2Vzc29ySW5zdGFsbFtdKSBzdGFuZGlucy50b0FycmF5KG5ldyBJUHJvY2Vzc29ySW5zdGFsbFtzdGFuZGlucy5zaXplKCldKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpcmVTZWxlY3Rpb25DaGFuZ2VkKCkKLQl7Ci0JCVNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCA9IG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQodGhpcywgZ2V0U2VsZWN0aW9uKCkpOwotCQlPYmplY3RbXSBsaXN0ZW5lcnMgPSBmU2VsZWN0aW9uTGlzdGVuZXJzLmdldExpc3RlbmVycygpOwotCQlmb3IgKE9iamVjdCBlbGVtZW50IDogbGlzdGVuZXJzKQotCQl7Ci0JCQlJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyID0gKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpIGVsZW1lbnQ7Ci0JCQlsaXN0ZW5lci5zZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNvcnRzIGJ5IHR5cGUsIGFuZCBuYW1lIHdpdGhpbiB0eXBlLgotCSAqLwotCXByaXZhdGUgdm9pZCBzb3J0QnlUeXBlKCkKLQl7Ci0JCXRhYmxlVmlld2VyLnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpCi0JCQl7Ci0JCQkJSVByb2Nlc3Nvckluc3RhbGwgbGVmdCA9IChJUHJvY2Vzc29ySW5zdGFsbCkgZTE7Ci0JCQkJSVByb2Nlc3Nvckluc3RhbGwgcmlnaHQgPSAoSVByb2Nlc3Nvckluc3RhbGwpIGUyOwotCQkJCXJldHVybiBsZWZ0LmdldFByb2Nlc3NvclR5cGUoKS5nZXRMYWJlbCgpLmNvbXBhcmVUb0lnbm9yZUNhc2UocmlnaHQuZ2V0UHJvY2Vzc29yVHlwZSgpLmdldExhYmVsKCkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIGlzU29ydGVyUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkKLQkJCXsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNvcnRCeVZlcnNpb24oKQotCXsKLQkJdGFibGVWaWV3ZXIuc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgZTEsIE9iamVjdCBlMikKLQkJCXsKLQkJCQlJUHJvY2Vzc29ySW5zdGFsbCBsZWZ0ID0gKElQcm9jZXNzb3JJbnN0YWxsKSBlMTsKLQkJCQlJUHJvY2Vzc29ySW5zdGFsbCByaWdodCA9IChJUHJvY2Vzc29ySW5zdGFsbCkgZTI7Ci0JCQkJcmV0dXJuIGxlZnQuZ2V0U3VwcG9ydHMoKS5jb21wYXJlVG9JZ25vcmVDYXNlKHJpZ2h0LmdldFN1cHBvcnRzKCkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIGlzU29ydGVyUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkKLQkJCXsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogU29ydHMgYnkgbmFtZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc29ydEJ5TmFtZSgpCi0JewotCQl0YWJsZVZpZXdlci5zZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKQotCQkJewotCQkJCWlmICgoZTEgaW5zdGFuY2VvZiBJUHJvY2Vzc29ySW5zdGFsbCkgJiYgKGUyIGluc3RhbmNlb2YgSVByb2Nlc3Nvckluc3RhbGwpKQotCQkJCXsKLQkJCQkJSVByb2Nlc3Nvckluc3RhbGwgbGVmdCA9IChJUHJvY2Vzc29ySW5zdGFsbCkgZTE7Ci0JCQkJCUlQcm9jZXNzb3JJbnN0YWxsIHJpZ2h0ID0gKElQcm9jZXNzb3JJbnN0YWxsKSBlMjsKLQkJCQkJcmV0dXJuIGxlZnQuZ2V0TmFtZSgpLmNvbXBhcmVUb0lnbm9yZUNhc2UocmlnaHQuZ2V0TmFtZSgpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmNvbXBhcmUodmlld2VyLCBlMSwgZTIpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIGlzU29ydGVyUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkKLQkJCXsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVuYWJsZUJ1dHRvbnMoKQotCXsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJaW50IHNlbGVjdGlvbkNvdW50ID0gc2VsZWN0aW9uLnNpemUoKTsKLQkJZkVkaXRCdXR0b24uc2V0RW5hYmxlZChzZWxlY3Rpb25Db3VudCA9PSAxKTsKLQkJaWYgKHNlbGVjdGlvbkNvdW50ID4gMCAmJiBzZWxlY3Rpb25Db3VudCA8IHRhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCkpCi0JCXsKLQkJCUl0ZXJhdG9yPD8+IGl0ZXJhdG9yID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotCQkJewotCQkJCUlQcm9jZXNzb3JJbnN0YWxsIGluc3RhbGwgPSAoSVByb2Nlc3Nvckluc3RhbGwpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAoaW5zdGFsbC5pc0NvbnRyaWJ1dGVkKCkpCi0JCQkJewotCQkJCQlmUmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJZlJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJZlJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBCdXR0b24gY3JlYXRlUHVzaEJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwpCi0JewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKLQkJYnV0dG9uLnNldFRleHQobGFiZWwpOwotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKQotCXsKLQkJcmV0dXJuIGZDb250cm9sOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFByb2Nlc3NvcnMoSVByb2Nlc3Nvckluc3RhbGxbXSB2bXMpCi0JewotCQlwcm9jZXNzb3JzLmNsZWFyKCk7Ci0JCWZvciAoSVByb2Nlc3Nvckluc3RhbGwgZWxlbWVudCA6IHZtcykKLQkJewotCQkJcHJvY2Vzc29ycy5hZGQoZWxlbWVudCk7Ci0JCX0KLQkJdGFibGVWaWV3ZXIuc2V0SW5wdXQocHJvY2Vzc29ycyk7Ci0JCS8vIHRhYmxlVmlld2VyLnJlZnJlc2goKTsKLQl9Ci0KLQlwdWJsaWMgSVByb2Nlc3Nvckluc3RhbGxbXSBnZXRQcm9jZXNzb3JzKCkKLQl7Ci0JCXJldHVybiAoSVByb2Nlc3Nvckluc3RhbGxbXSkgcHJvY2Vzc29ycy50b0FycmF5KG5ldyBJUHJvY2Vzc29ySW5zdGFsbFtwcm9jZXNzb3JzLnNpemUoKV0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRQcm9jZXNzb3IoKQotCXsKLQkJQWRkUHJvY2Vzc29yRGlhbG9nIGRpYWxvZyA9IG5ldyBBZGRQcm9jZXNzb3JEaWFsb2codGhpcywgZ2V0U2hlbGwoKSwgWFNMVFJ1bnRpbWUuZ2V0UHJvY2Vzc29yVHlwZXNFeGNsSlJFRGVmYXVsdCgpLCBudWxsKTsKLQkJZGlhbG9nLnNldFRpdGxlKFByb2Nlc3Nvck1lc3NhZ2VzLkFkZFByb2Nlc3NvckRpYWxvZ19BZGRfVGl0bGUpOwotCQlpZiAoZGlhbG9nLm9wZW4oKSAhPSBXaW5kb3cuT0spCi0JCXsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHByb2Nlc3NvckFkZGVkKElQcm9jZXNzb3JJbnN0YWxsIGluc3RhbGwpCi0JewotCQlwcm9jZXNzb3JzLmFkZChpbnN0YWxsKTsKLQkJdGFibGVWaWV3ZXIuYWRkKGluc3RhbGwpOwotCQl0YWJsZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oaW5zdGFsbCksIHRydWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRHVwbGljYXRlTmFtZShTdHJpbmcgbmFtZSkKLQl7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvY2Vzc29ycy5zaXplKCk7IGkrKykKLQkJewotCQkJSVByb2Nlc3Nvckluc3RhbGwgaW5zdGFsbCA9IChJUHJvY2Vzc29ySW5zdGFsbCkgcHJvY2Vzc29ycy5nZXQoaSk7Ci0JCQlpZiAoaW5zdGFsbC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKQotCQkJewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZWRpdFByb2Nlc3NvcigpCi0JewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQlJUHJvY2Vzc29ySW5zdGFsbCBpbnN0YWxsID0gKElQcm9jZXNzb3JJbnN0YWxsKSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCWlmIChpbnN0YWxsID09IG51bGwpCi0JCXsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoaW5zdGFsbC5pc0NvbnRyaWJ1dGVkKCkpCi0JCXsKLQkJCVByb2Nlc3NvckRldGFpbHNEaWFsb2cgZGlhbG9nID0gbmV3IFByb2Nlc3NvckRldGFpbHNEaWFsb2coZ2V0U2hlbGwoKSwgaW5zdGFsbCk7Ci0JCQlkaWFsb2cub3BlbigpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJQWRkUHJvY2Vzc29yRGlhbG9nIGRpYWxvZyA9IG5ldyBBZGRQcm9jZXNzb3JEaWFsb2codGhpcywgZ2V0U2hlbGwoKSwgWFNMVFJ1bnRpbWUuZ2V0UHJvY2Vzc29yVHlwZXNFeGNsSlJFRGVmYXVsdCgpLCBpbnN0YWxsKTsKLQkJCWRpYWxvZy5zZXRUaXRsZShQcm9jZXNzb3JNZXNzYWdlcy5BZGRQcm9jZXNzb3JEaWFsb2dfRWRpdF9UaXRsZSk7Ci0JCQlpZiAoZGlhbG9nLm9wZW4oKSAhPSBXaW5kb3cuT0spCi0JCQl7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJLy8gZmlsbFdpdGhXb3Jrc3BhY2VQcm9jZXNzb3JzKCk7Ci0JCQl0YWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlUHJvY2Vzc29ycygpCi0JewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQlJUHJvY2Vzc29ySW5zdGFsbFtdIHZtcyA9IG5ldyBJUHJvY2Vzc29ySW5zdGFsbFtzZWxlY3Rpb24uc2l6ZSgpXTsKLQkJSXRlcmF0b3I8Pz4gaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOwotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkKLQkJewotCQkJdm1zW2ldID0gKElQcm9jZXNzb3JJbnN0YWxsKSBpdGVyLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlyZW1vdmVQcm9jZXNzb3JzKHZtcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJvY2Vzc29ycyhJUHJvY2Vzc29ySW5zdGFsbFtdIHRoZUluc3RhbGxzKQotCXsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gcHJldiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCk7Ci0JCWZvciAoSVByb2Nlc3Nvckluc3RhbGwgZWxlbWVudCA6IHRoZUluc3RhbGxzKQotCQl7Ci0JCQlwcm9jZXNzb3JzLnJlbW92ZShlbGVtZW50KTsKLQkJfQotCQl0YWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIGN1cnIgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFNlbGVjdGlvbigpOwotCQlpZiAoIWN1cnIuZXF1YWxzKHByZXYpKQotCQl7Ci0JCQlJUHJvY2Vzc29ySW5zdGFsbFtdIGluc3RhbGxzID0gZ2V0UHJvY2Vzc29ycygpOwotCQkJaWYgKGN1cnIuc2l6ZSgpID09IDAgJiYgaW5zdGFsbHMubGVuZ3RoID09IDEpCi0JCQl7Ci0JCQkJLy8gcGljayBhIGRlZmF1bHQgaW5zdGFsbCBhdXRvbWF0aWNhbGx5Ci0JCQkJc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGluc3RhbGxzWzBdKSk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJZmlyZVNlbGVjdGlvbkNoYW5nZWQoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldENoZWNrZWRJbnN0YWxsKElQcm9jZXNzb3JJbnN0YWxsIGluc3RhbGwpCi0JewotCQlpZiAoaW5zdGFsbCA9PSBudWxsKQotCQl7Ci0JCQlzZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oKSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlzZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oaW5zdGFsbCkpOwotCQl9Ci0JfQotCi0JcHVibGljIElQcm9jZXNzb3JJbnN0YWxsIGdldENoZWNrZWRJbnN0YWxsKCkKLQl7Ci0JCU9iamVjdFtdIG9iamVjdHMgPSB0YWJsZVZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKTsKLQkJaWYgKG9iamVjdHMubGVuZ3RoID09IDApCi0JCXsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiAoSVByb2Nlc3Nvckluc3RhbGwpIG9iamVjdHNbMF07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0U29ydENvbHVtbihpbnQgY29sdW1uKQotCXsKLQkJc3dpdGNoIChjb2x1bW4pCi0JCXsKLQkJCWNhc2UgMToKLQkJCQlzb3J0QnlOYW1lKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDI6Ci0JCQkJc29ydEJ5VHlwZSgpOwotCQkJCWJyZWFrOwotCQl9Ci0JCXN1cGVyLnNldFNvcnRDb2x1bW4oY29sdW1uKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVGFibGUgZ2V0VGFibGUoKQotCXsKLQkJcmV0dXJuIHRhYmxlVmlld2VyLmdldFRhYmxlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElEaWFsb2dTZXR0aW5ncyBnZXREaWFsb2dTZXR0aW5ncygpCi0JewotCQlyZXR1cm4gWFNMRGVidWdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFF1YWxpZmllcigpCi0JewotCQlyZXR1cm4gWFNMRGVidWdVSUNvbnN0YW50cy5QUk9DRVNTT1JfREVUQUlMU19ESUFMT0c7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pCi0JewotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1BcHBseShJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24pCi0JewotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRzKElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlndXJhdGlvbikKLQl7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBQcm9jZXNzb3JzQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIKLQl7Ci0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXQpCi0JCXsKLQkJCXJldHVybiBwcm9jZXNzb3JzLnRvQXJyYXkoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkKLQkJewotCQl9Ci0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpCi0JCXsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgVk1MYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIKLQl7Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KQotCQl7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQcm9jZXNzb3JJbnN0YWxsKQotCQkJewotCQkJCUlQcm9jZXNzb3JJbnN0YWxsIGluc3RhbGwgPSAoSVByb2Nlc3Nvckluc3RhbGwpIGVsZW1lbnQ7Ci0JCQkJc3dpdGNoIChjb2x1bW5JbmRleCkKLQkJCQl7Ci0JCQkJCWNhc2UgMDoKLQkJCQkJCXJldHVybiBpbnN0YWxsLmdldE5hbWUoKTsKLQkJCQkJY2FzZSAxOgotCQkJCQkJcmV0dXJuIGluc3RhbGwuZ2V0UHJvY2Vzc29yVHlwZSgpLmdldExhYmVsKCk7Ci0JCQkJCWNhc2UgMjoKLQkJCQkJCXJldHVybiBpbnN0YWxsLmdldFN1cHBvcnRzKCk7Ci0JCQkJCWNhc2UgMzoKLQkJCQkJCWlmIChpbnN0YWxsLmdldERlYnVnZ2VyKCkgIT0gbnVsbCkKLQkJCQkJCXsKLQkJCQkJCQlyZXR1cm4gaW5zdGFsbC5nZXREZWJ1Z2dlcigpLmdldE5hbWUoKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiAiTm9uZSI7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGVsZW1lbnQudG9TdHJpbmcoKTsKLQkJfQotCi0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KQotCQl7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3ByZWZlcmVuY2VzL091dHB1dEJsb2NrLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvcHJlZmVyZW5jZXMvT3V0cHV0QmxvY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk5YjJhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvcHJlZmVyZW5jZXMvT3V0cHV0QmxvY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbE1vZGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRleHRDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuQWJzdHJhY3RUYWJsZUJsb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuWFNMRGVidWdVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLlhTTERlYnVnVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuSU91dHB1dFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLklQcm9jZXNzb3JUeXBlOwotCi1wdWJsaWMgY2xhc3MgT3V0cHV0QmxvY2sgZXh0ZW5kcyBBYnN0cmFjdFRhYmxlQmxvY2sKLXsKLQlwcml2YXRlIFRhYmxlIHRhYmxlOwotCXByaXZhdGUgVGFibGVWaWV3ZXIgdFZpZXdlcjsKLQlwcml2YXRlIFByb3BlcnRpZXMgcHJvcGVydGllczsKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJRGlhbG9nU2V0dGluZ3MgZ2V0RGlhbG9nU2V0dGluZ3MoKQotCXsKLQkJcmV0dXJuIFhTTERlYnVnVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRRdWFsaWZpZXIoKQotCXsKLQkJcmV0dXJuIFhTTERlYnVnVUlDb25zdGFudHMuT1VUUFVUX0JMT0NLOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBUYWJsZSBnZXRUYWJsZSgpCi0JewotCQlyZXR1cm4gdGFibGU7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KQotCXsKLQkJdGFibGUgPSBuZXcgVGFibGUocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULlZfU0NST0xMKTsKLQkJc2V0Q29udHJvbCh0YWJsZSk7Ci0KLQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCi0JCVRhYmxlQ29sdW1uIGMxID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWMxLnNldFdpZHRoKDQ1MCk7Ci0JCWMxLnNldFJlc2l6YWJsZSh0cnVlKTsKLQkJYzEuc2V0VGV4dCgiUHJvcGVydHkiKTsKLQotCQlUYWJsZUNvbHVtbiBjMiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljMi5zZXRXaWR0aCgxNTApOwotCQljMi5zZXRSZXNpemFibGUodHJ1ZSk7Ci0JCWMyLnNldFRleHQoIlZhbHVlIik7Ci0KLQkJdFZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcih0YWJsZSk7Ci0JCXRWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcigpCi0JCXsKLQotCQkJcHJpdmF0ZSBJT3V0cHV0UHJvcGVydHlbXSBhbGxQcm9wZXJ0aWVzOwotCi0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkKLQkJCXsKLQkJCQlyZXR1cm4gYWxsUHJvcGVydGllczsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpCi0JCQl7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkKLQkJCXsKLQkJCQlhbGxQcm9wZXJ0aWVzID0gKElPdXRwdXRQcm9wZXJ0eVtdKSBuZXdJbnB1dDsKLQkJCX0KLQkJfSk7Ci0JCXRWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgSVRhYmxlTGFiZWxQcm92aWRlcigpCi0JCXsKLQotCQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpCi0JCQl7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KQotCQkJewotCQkJCUlPdXRwdXRQcm9wZXJ0eSBwcm9wID0gKElPdXRwdXRQcm9wZXJ0eSkgZWxlbWVudDsKLQkJCQlzd2l0Y2ggKGNvbHVtbkluZGV4KQotCQkJCXsKLQkJCQkJY2FzZSAwOgotCQkJCQkJcmV0dXJuIHByb3AuZ2V0VVJJKCk7Ci0JCQkJCWNhc2UgMToKLQkJCQkJCXJldHVybiAoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChwcm9wLmdldFVSSSgpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuICIhISI7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpCi0JCQl7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotCQkJewotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkKLQkJCXsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpCi0JCQl7Ci0JCQl9Ci0KLQkJfSk7Ci0JCXRWaWV3ZXIuc2V0Q29sdW1uUHJvcGVydGllcyhuZXcgU3RyaW5nW10KLQkJeyAibmFtZSIsICJ2YWx1ZSIgfSk7Ci0JCXRWaWV3ZXIuc2V0Q2VsbE1vZGlmaWVyKG5ldyBJQ2VsbE1vZGlmaWVyKCkKLQkJewotCQkJcHVibGljIGJvb2xlYW4gY2FuTW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpCi0JCQl7Ci0JCQkJcmV0dXJuICJ2YWx1ZSIuZXF1YWxzKHByb3BlcnR5KTsKLQkJCX0KLQotCQkJcHVibGljIE9iamVjdCBnZXRWYWx1ZShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KQotCQkJewotCQkJCUlPdXRwdXRQcm9wZXJ0eSBwcm9wID0gKElPdXRwdXRQcm9wZXJ0eSkgZWxlbWVudDsKLQkJCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChwcm9wLmdldFVSSSgpKTsKLQkJCQlyZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICIiIDogdmFsdWU7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgdmFsdWUpCi0JCQl7Ci0JCQkJSXRlbSBpdGVtID0gKEl0ZW0pIGVsZW1lbnQ7Ci0JCQkJSU91dHB1dFByb3BlcnR5IHByb3AgPSAoSU91dHB1dFByb3BlcnR5KSBpdGVtLmdldERhdGEoKTsKLQkJCQlpZiAodmFsdWUgPT0gbnVsbCB8fCAiIi5lcXVhbHModmFsdWUpKQotCQkJCQlwcm9wZXJ0aWVzLnJlbW92ZShwcm9wLmdldFVSSSgpKTsKLQkJCQllbHNlCi0JCQkJCXByb3BlcnRpZXMucHV0KHByb3AuZ2V0VVJJKCksIHZhbHVlKTsKLQkJCQl0Vmlld2VyLnVwZGF0ZShwcm9wLCBudWxsKTsKLQkJCX0KLQkJfSk7Ci0JCXRWaWV3ZXIuc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgZTEsIE9iamVjdCBlMikKLQkJCXsKLQkJCQlJT3V0cHV0UHJvcGVydHkgcHJvcDEgPSAoSU91dHB1dFByb3BlcnR5KSBlMTsKLQkJCQlJT3V0cHV0UHJvcGVydHkgcHJvcDIgPSAoSU91dHB1dFByb3BlcnR5KSBlMjsKLQkJCQlyZXR1cm4gcHJvcDEuZ2V0VVJJKCkuY29tcGFyZVRvKHByb3AyLmdldFVSSSgpKTsKLQkJCX0KLQkJfSk7Ci0KLQkJVGV4dENlbGxFZGl0b3IgZWRpdG9yID0gbmV3IFRleHRDZWxsRWRpdG9yKHRhYmxlKTsKLQotCQlDZWxsRWRpdG9yW10gZWRpdG9ycyA9IG5ldyBDZWxsRWRpdG9yW10KLQkJeyBudWxsLCBlZGl0b3IgfTsKLQkJdFZpZXdlci5zZXRDZWxsRWRpdG9ycyhlZGl0b3JzKTsKLQotCQlyZXN0b3JlQ29sdW1uU2V0dGluZ3MoKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKQotCXsKLQkJdFZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZnJlc2goKQotCXsKLQkJdFZpZXdlci5yZWZyZXNoKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T3V0cHV0UHJvcGVydHlWYWx1ZXMoSVByb2Nlc3NvclR5cGUgdHlwZSwgUHJvcGVydGllcyBwcm9wZXJ0aWVzKQotCXsKLQkJdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbnB1dChJT3V0cHV0UHJvcGVydHlbXSBrZXlzKQotCXsKLQkJdFZpZXdlci5zZXRJbnB1dChrZXlzKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikKLQl7Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybUFwcGx5KElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlndXJhdGlvbikKLQl7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdHMoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uKQotCXsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9wcmVmZXJlbmNlcy9PdXRwdXRQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3ByZWZlcmVuY2VzL091dHB1dFByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMGVkNmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3ByZWZlcmVuY2VzL091dHB1dFByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5YU0xEZWJ1Z1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLklPdXRwdXRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5JUHJvY2Vzc29yVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5YU0xUUnVudGltZTsKLQotcHVibGljIGNsYXNzIE91dHB1dFByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UKLXsKLQlwcml2YXRlIENvbWJvVmlld2VyIGNWaWV3ZXI7Ci0JcHJpdmF0ZSBPdXRwdXRCbG9jayBvdXRwdXRCbG9jazsKLQlwcml2YXRlIE91dHB1dEJsb2NrIHN0YW5kYXJkT3V0cHV0QmxvY2s7Ci0JcHJpdmF0ZSBNYXA8SVByb2Nlc3NvclR5cGUsIFByb3BlcnRpZXM+IHR5cGVQcm9wZXJ0eU1hcCA9IG5ldyBIYXNoTWFwPElQcm9jZXNzb3JUeXBlLCBQcm9wZXJ0aWVzPigpOwotCXByaXZhdGUgVGV4dCBkZXNjcmlwdGlvblRleHQ7Ci0KLQlwdWJsaWMgT3V0cHV0UHJlZmVyZW5jZVBhZ2UoKQotCXsKLQkJc3VwZXIoKTsKLQkJc2V0VGl0bGUoIk91dHB1dCBQcm9wZXJ0aWVzIik7Ci0JCXNldERlc2NyaXB0aW9uKCJTZXQgb3V0cHV0IHByb3BlcnRpZXMgdGhhdCB3aWxsIGJlIHVzZWQgYnkgZGVmYXVsdCBmb3IgYWxsIHRyYW5zZm9ybWF0aW9ucyIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpCi0JewotCQlwYXJlbnQgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJcGFyZW50LnNldExheW91dChsYXlvdXQpOwotCi0JCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOwotCQlncm91cC5zZXRUZXh0KCJTdGFuZGFyZCBQcm9wZXJ0aWVzIik7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0JCWdkLmhlaWdodEhpbnQgPSAxNTA7Ci0JCWdkLndpZHRoSGludCA9IDQ1MDsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlncm91cC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCXN0YW5kYXJkT3V0cHV0QmxvY2sgPSBuZXcgT3V0cHV0QmxvY2soKTsKLQkJc3RhbmRhcmRPdXRwdXRCbG9jay5jcmVhdGVDb250cm9sKGdyb3VwKTsKLQkJc3RhbmRhcmRPdXRwdXRCbG9jay5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKQotCQl7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLQkJCXsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpOwotCQkJCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJCQlpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpICE9IG51bGwpCi0JCQkJCXRleHQgPSAoKElPdXRwdXRQcm9wZXJ0eSkgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKS5nZXREZXNjcmlwdGlvbigpOwotCQkJCWRlc2NyaXB0aW9uVGV4dC5zZXRUZXh0KHRleHQgPT0gbnVsbCA/ICIiIDogdGV4dCk7Ci0JCQl9Ci0JCX0pOwotCQlnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotCQlzdGFuZGFyZE91dHB1dEJsb2NrLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlncm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OT05FKTsKLQkJZ3JvdXAuc2V0VGV4dCgiUHJvY2Vzc29yLVNwZWNpZmljIFByb3BlcnRpZXMiKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlncm91cC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoZ3JvdXAsIFNXVC5OVUxMKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoU1dULk5PTkUsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSk7Ci0JCWxhYmVsLnNldFRleHQoIlByb2Nlc3NvciBUeXBlOiIpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhncm91cCwgU1dULlJFQURfT05MWSB8IFNXVC5TSU5HTEUpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShTV1QuTk9ORSwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKTsKLQkJY29tYm8uc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJY1ZpZXdlciA9IG5ldyBDb21ib1ZpZXdlcihjb21ibyk7Ci0JCWNWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcigpCi0JCXsKLQotCQkJcHJpdmF0ZSBJUHJvY2Vzc29yVHlwZVtdIHR5cGVzOwotCi0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkKLQkJCXsKLQkJCQlyZXR1cm4gdHlwZXM7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotCQkJewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpCi0JCQl7Ci0JCQkJdHlwZXMgPSAoSVByb2Nlc3NvclR5cGVbXSkgbmV3SW5wdXQ7Ci0JCQl9Ci0JCX0pOwotCQljVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IExhYmVsUHJvdmlkZXIoKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkKLQkJCXsKLQkJCQlJUHJvY2Vzc29yVHlwZSB0eXBlID0gKElQcm9jZXNzb3JUeXBlKSBlbGVtZW50OwotCQkJCXJldHVybiB0eXBlLmdldExhYmVsKCk7Ci0JCQl9Ci0JCX0pOwotCQljVmlld2VyLnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpCi0JCQl7Ci0JCQkJSVByb2Nlc3NvclR5cGUgdHlwZTEgPSAoSVByb2Nlc3NvclR5cGUpIGUxOwotCQkJCUlQcm9jZXNzb3JUeXBlIHR5cGUyID0gKElQcm9jZXNzb3JUeXBlKSBlMjsKLQkJCQlyZXR1cm4gdHlwZTEuZ2V0TGFiZWwoKS5jb21wYXJlVG8odHlwZTIuZ2V0TGFiZWwoKSk7Ci0JCQl9Ci0JCX0pOwotCQljVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpCi0JCXsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KQotCQkJewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJSVByb2Nlc3NvclR5cGUgdHlwZSA9IChJUHJvY2Vzc29yVHlwZSkgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCWlmICh0eXBlICE9IG51bGwpCi0JCQkJewotCQkJCQlvdXRwdXRCbG9jay5zZXRPdXRwdXRQcm9wZXJ0eVZhbHVlcyh0eXBlLCAoUHJvcGVydGllcykgdHlwZVByb3BlcnR5TWFwLmdldCh0eXBlKSk7Ci0JCQkJCW91dHB1dEJsb2NrLnNldElucHV0KHR5cGUuZ2V0T3V0cHV0UHJvcGVydGllcygpKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJb3V0cHV0QmxvY2suc2V0T3V0cHV0UHJvcGVydHlWYWx1ZXModHlwZSwgbmV3IFByb3BlcnRpZXMoKSk7Ci0JCQkJCW91dHB1dEJsb2NrLnNldElucHV0KG5ldyBJT3V0cHV0UHJvcGVydHlbMF0pOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCWNWaWV3ZXIuYWRkRmlsdGVyKG5ldyBWaWV3ZXJGaWx0ZXIoKQotCQl7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnRFbGVtZW50LCBPYmplY3QgZWxlbWVudCkKLQkJCXsKLQkJCQlJUHJvY2Vzc29yVHlwZSB0eXBlID0gKElQcm9jZXNzb3JUeXBlKSBlbGVtZW50OwotCQkJCXJldHVybiAhdHlwZS5lcXVhbHMoWFNMVFJ1bnRpbWUuZ2V0UHJvY2Vzc29yVHlwZShYU0xUUnVudGltZS5KUkVfREVGQVVMVF9QUk9DRVNTT1JfVFlQRV9JRCkpOwotCQkJfQotCQl9KTsKLQotCQlvdXRwdXRCbG9jayA9IG5ldyBPdXRwdXRCbG9jaygpOwotCQlvdXRwdXRCbG9jay5jcmVhdGVDb250cm9sKGdyb3VwKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlvdXRwdXRCbG9jay5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXN0YW5kYXJkT3V0cHV0QmxvY2suZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ2QpOwotCQlvdXRwdXRCbG9jay5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKQotCQl7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLQkJCXsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpOwotCQkJCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJCQlpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpICE9IG51bGwpCi0JCQkJewotCQkJCQl0ZXh0ID0gKChJT3V0cHV0UHJvcGVydHkpIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSkuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCQl9Ci0JCQkJZGVzY3JpcHRpb25UZXh0LnNldFRleHQodGV4dCA9PSBudWxsID8gIiIgOiB0ZXh0KTsKLQkJCX0KLQkJfSk7Ci0KLQkJZGVzY3JpcHRpb25UZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuV1JBUCB8IFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZIHwgU1dULlZfU0NST0xMKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5OT05FLCB0cnVlLCBmYWxzZSk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJZ2QuaGVpZ2h0SGludCA9IDYwOwotCQlkZXNjcmlwdGlvblRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJc2V0SW5wdXQoKTsKLQotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRJbnB1dCgpCi0JewotCQlJUHJvY2Vzc29yVHlwZVtdIHR5cGVzID0gWFNMVFJ1bnRpbWUuZ2V0UHJvY2Vzc29yVHlwZXMoKTsKLQkJdHlwZVByb3BlcnR5TWFwLmNsZWFyKCk7Ci0JCWZvciAoSVByb2Nlc3NvclR5cGUgdHlwZSA6IHR5cGVzKQotCQl7Ci0JCQl0eXBlUHJvcGVydHlNYXAucHV0KHR5cGUsIChQcm9wZXJ0aWVzKXR5cGUuZ2V0T3V0cHV0UHJvcGVydHlWYWx1ZXMoKS5jbG9uZSgpKTsKLQkJfQotCi0JCUlQcm9jZXNzb3JUeXBlIGpyZURlZmF1bHRUeXBlID0gWFNMVFJ1bnRpbWUuZ2V0UHJvY2Vzc29yVHlwZShYU0xUUnVudGltZS5KUkVfREVGQVVMVF9QUk9DRVNTT1JfVFlQRV9JRCk7Ci0JCXN0YW5kYXJkT3V0cHV0QmxvY2suc2V0T3V0cHV0UHJvcGVydHlWYWx1ZXMoanJlRGVmYXVsdFR5cGUsIChQcm9wZXJ0aWVzKSB0eXBlUHJvcGVydHlNYXAuZ2V0KGpyZURlZmF1bHRUeXBlKSk7Ci0JCXN0YW5kYXJkT3V0cHV0QmxvY2suc2V0SW5wdXQoanJlRGVmYXVsdFR5cGUuZ2V0T3V0cHV0UHJvcGVydGllcygpKTsKLQotCQljVmlld2VyLnNldElucHV0KHR5cGVzKTsKLQkJY1ZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oRmVhdHVyZXNQcmVmZXJlbmNlUGFnZS5nZXRJbml0aWFsVHlwZSgpKSwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkKLQl7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkKLQl7Ci0JCUlQcm9jZXNzb3JUeXBlW10gdHlwZXMgPSBYU0xUUnVudGltZS5nZXRQcm9jZXNzb3JUeXBlcygpOwotCQl0eXBlUHJvcGVydHlNYXAuY2xlYXIoKTsKLQkJZm9yIChJUHJvY2Vzc29yVHlwZSB0eXBlIDogdHlwZXMpCi0JCXsKLQkJCXR5cGVQcm9wZXJ0eU1hcC5wdXQodHlwZSwgWFNMVFJ1bnRpbWUuY3JlYXRlRGVmYXVsdE91dHB1dFByb3BlcnRpZXModHlwZS5nZXRJZCgpKSk7Ci0JCX0KLQotCQlJUHJvY2Vzc29yVHlwZSBqcmVEZWZhdWx0VHlwZSA9IFhTTFRSdW50aW1lLmdldFByb2Nlc3NvclR5cGUoWFNMVFJ1bnRpbWUuSlJFX0RFRkFVTFRfUFJPQ0VTU09SX1RZUEVfSUQpOwotCQlzdGFuZGFyZE91dHB1dEJsb2NrLnNldE91dHB1dFByb3BlcnR5VmFsdWVzKGpyZURlZmF1bHRUeXBlLCAoUHJvcGVydGllcykgdHlwZVByb3BlcnR5TWFwLmdldChqcmVEZWZhdWx0VHlwZSkpOwotCQlzdGFuZGFyZE91dHB1dEJsb2NrLnNldElucHV0KGpyZURlZmF1bHRUeXBlLmdldE91dHB1dFByb3BlcnRpZXMoKSk7Ci0KLQkJY1ZpZXdlci5zZXRJbnB1dCh0eXBlcyk7Ci0JCWNWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKEZlYXR1cmVzUHJlZmVyZW5jZVBhZ2UuZ2V0SW5pdGlhbFR5cGUoKSksIHRydWUpOwotCi0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpCi0JewotCQlvdXRwdXRCbG9jay5zYXZlQ29sdW1uU2V0dGluZ3MoKTsKLQkJZmluYWwgYm9vbGVhbltdIG9rID0gbmV3IGJvb2xlYW5bMV07Ci0JCXRyeQotCQl7Ci0JCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkKLQkJCXsKLQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KLQkJCQl7Ci0JCQkJCXRyeQotCQkJCQl7Ci0JCQkJCQlYU0xUUnVudGltZS5zYXZlT3V0cHV0UHJvcGVydHlQcmVmZXJlbmNlcyh0eXBlUHJvcGVydHlNYXAsbW9uaXRvcik7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLQkJCQkJewotCQkJCQkJWFNMRGVidWdVSVBsdWdpbi5sb2coZSk7Ci0JCQkJCX0KLQkJCQkJb2tbMF0gPSAhbW9uaXRvci5pc0NhbmNlbGVkKCk7Ci0JCQkJfQotCQkJfTsKLQkJCVhTTERlYnVnVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpLmJ1c3lDdXJzb3JXaGlsZShydW5uYWJsZSk7Ci0JCX0KLQkJY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkKLQkJewotCQkJWFNMRGVidWdVSVBsdWdpbi5sb2coZSk7Ci0JCX0KLQkJY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpCi0JCXsKLQkJCVhTTERlYnVnVUlQbHVnaW4ubG9nKGUpOwotCQl9Ci0JCXJldHVybiBva1swXTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvcHJlZmVyZW5jZXMvUHJvY2Vzc29yTGlicmFyeUJsb2NrLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvcHJlZmVyZW5jZXMvUHJvY2Vzc29yTGlicmFyeUJsb2NrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExZmYwZTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3ByZWZlcmVuY2VzL1Byb2Nlc3NvckxpYnJhcnlCbG9jay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5FbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLklTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MubmF2aWdhdG9yLlJlc291cmNlQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLlhTTERlYnVnVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLnByb2Nlc3Nvci5JbnN0YWxsU3RhbmRpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMucHJvY2Vzc29yLkphckNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMucHJvY2Vzc29yLkphckxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLnByb2Nlc3Nvci5Qcm9jZXNzb3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5JUHJvY2Vzc29ySW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5JUHJvY2Vzc29ySmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLklQcm9jZXNzb3JUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLlhTTFRSdW50aW1lOwotCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc29yTGlicmFyeUJsb2NrIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIsIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIKLXsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMQVNUX1BBVEhfU0VUVElORyA9ICJMQVNUX1BBVEhfU0VUVElORyI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFTVF9XT1JLU1BBQ0VfUEFUSF9TRVRUSU5HID0gIkxBU1RfV09SS1NQQUNFX1BBVEhfU0VUVElORyI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBTE9HX1NFVFRJTkdTX1BSRUZJWCA9ICJQcm9jZXNzb3JMaWJyYXJ5QmxvY2siOwotCXByb3RlY3RlZCBJbnN0YWxsU3RhbmRpbiBpbnN0YWxsOwotCXByb3RlY3RlZCBJUHJvY2Vzc29yVHlwZSBpbnN0YWxsVHlwZTsKLQlwcm90ZWN0ZWQgQWRkUHJvY2Vzc29yRGlhbG9nIGFkZERpYWxvZyA9IG51bGw7Ci0JcHJvdGVjdGVkIFRhYmxlVmlld2VyIHRhYmxlVmlld2VyOwotCXByaXZhdGUgQnV0dG9uIHJlbW92ZUJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBhZGRCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gYWRkV29ya3NwYWNlQnV0dG9uOwotCi0JcHJpdmF0ZSBmaW5hbCBJU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yIHZhbGlkYXRvciA9IG5ldyBJU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yKCkKLQl7Ci0JCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKE9iamVjdFtdIHNlbGVjdGlvbikKLQkJewotCQkJaWYgKHNlbGVjdGlvbi5sZW5ndGggPT0gMCkKLQkJCXsKLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBYU0xEZWJ1Z1VJUGx1Z2luLlBMVUdJTl9JRCwgMCwgIiIsIG51bGwpOwotCQkJfQotCQkJZm9yIChPYmplY3QgZWxlbWVudCA6IHNlbGVjdGlvbikKLQkJCXsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElGb2xkZXIpCi0JCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFhTTERlYnVnVUlQbHVnaW4uUExVR0lOX0lELCAwLCAiIiwgbnVsbCk7Ci0JCQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElGaWxlKQotCQkJCXsKLQkJCQkJLy8gSUZpbGUgZmlsZSA9IChJRmlsZSkgc2VsZWN0aW9uW2ldOwotCQkJCQkvLyBUT0RPIGNoZWNrIHRoYXQgdGhlIGZpbGUgaXMgbm90IGFscmVhZHkgb24gdGhlIGNsYXNzcGF0aAotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIFhTTERlYnVnVUlQbHVnaW4uUExVR0lOX0lELCAwLCAiIiwgbnVsbCk7Ci0JCX0KLQl9OwotCi0JcHVibGljIFByb2Nlc3NvckxpYnJhcnlCbG9jayhBZGRQcm9jZXNzb3JEaWFsb2cgZGlhbG9nKQotCXsKLQkJYWRkRGlhbG9nID0gZGlhbG9nOwotCX0KLQotCXB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLQl7Ci0JCUZvbnQgZm9udCA9IHBhcmVudC5nZXRGb250KCk7Ci0KLQkJQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IHRvcExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCXRvcExheW91dC5udW1Db2x1bW5zID0gMjsKLQkJdG9wTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCXRvcExheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXAuc2V0TGF5b3V0KHRvcExheW91dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWNvbXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJdGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIoY29tcCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdkLmhlaWdodEhpbnQgPSA2OwotCQl0YWJsZVZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCUphckNvbnRlbnRQcm92aWRlciBmTGlicmFyeUNvbnRlbnRQcm92aWRlciA9IG5ldyBKYXJDb250ZW50UHJvdmlkZXIoKTsKLQkJdGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGZMaWJyYXJ5Q29udGVudFByb3ZpZGVyKTsKLQkJdGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgSmFyTGFiZWxQcm92aWRlcigpKTsKLQkJdGFibGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCi0JCUNvbXBvc2l0ZSBwYXRoQnV0dG9uQ29tcCA9IG5ldyBDb21wb3NpdGUoY29tcCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IHBhdGhCdXR0b25MYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlwYXRoQnV0dG9uTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCXBhdGhCdXR0b25MYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlwYXRoQnV0dG9uQ29tcC5zZXRMYXlvdXQocGF0aEJ1dHRvbkxheW91dCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCXBhdGhCdXR0b25Db21wLnNldExheW91dERhdGEoZ2QpOwotCQlwYXRoQnV0dG9uQ29tcC5zZXRGb250KGZvbnQpOwotCi0JCWFkZFdvcmtzcGFjZUJ1dHRvbiA9IGNyZWF0ZVB1c2hCdXR0b24ocGF0aEJ1dHRvbkNvbXAsIFByb2Nlc3Nvck1lc3NhZ2VzLlByb2Nlc3NvckxpYnJhcnlCbG9ja19BZGRXb3Jrc3BhY2VCdXR0b24pOwotCQlhZGRXb3Jrc3BhY2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJYWRkQnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihwYXRoQnV0dG9uQ29tcCwgUHJvY2Vzc29yTWVzc2FnZXMuUHJvY2Vzc29yTGlicmFyeUJsb2NrX0FkZEJ1dHRvbik7Ci0JCWFkZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotCQlyZW1vdmVCdXR0b24gPSBjcmVhdGVQdXNoQnV0dG9uKHBhdGhCdXR0b25Db21wLCBQcm9jZXNzb3JNZXNzYWdlcy5Qcm9jZXNzb3JMaWJyYXJ5QmxvY2tfUmVtb3ZlQnV0dG9uKTsKLQkJcmVtb3ZlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0JCXJldHVybiBjb21wOwotCX0KLQotCXByb3RlY3RlZCBCdXR0b24gY3JlYXRlUHVzaEJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwpCi0JewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKLQkJYnV0dG9uLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0JCWJ1dHRvbi5zZXRUZXh0KGxhYmVsKTsKLQkJYWRkRGlhbG9nLnNldEJ1dHRvbkxheW91dERhdGEoYnV0dG9uKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVWZXJ0aWNhbFNwYWNlcihDb21wb3NpdGUgY29tcCwgaW50IGNvbFNwYW4pCi0JewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wLCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gY29sU3BhbjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oSW5zdGFsbFN0YW5kaW4gc3RhbmRpbiwgSVByb2Nlc3NvclR5cGUgdHlwZSkKLQl7Ci0JCWluc3RhbGwgPSBzdGFuZGluOwotCQlpbnN0YWxsVHlwZSA9IHR5cGU7Ci0JCWlmIChpbnN0YWxsICE9IG51bGwpCi0JCQl0YWJsZVZpZXdlci5zZXRJbnB1dChpbnN0YWxsKTsKLQkJdXBkYXRlKCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyBidXR0b25zIGFuZCBzdGF0dXMgYmFzZWQgb24gY3VycmVudCBsaWJyYXJpZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGUoKQotCXsKLQkJdXBkYXRlQnV0dG9ucygpOwotCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCWlmIChpbnN0YWxsICE9IG51bGwgJiYgaW5zdGFsbC5nZXRQcm9jZXNzb3JKYXJzKCkubGVuZ3RoID09IDApCi0JCXsKLQkJCXN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLCBYU0xEZWJ1Z1VJUGx1Z2luLlBMVUdJTl9JRCwgMCwgIk9uZSBvciBtb3JlIGphciBmaWxlcyBtdXN0IGJlIHNwZWNpZmllZCIsIG51bGwpOwotCQl9Ci0JCWFkZERpYWxvZy5zZXRTeXN0ZW1MaWJyYXJ5U3RhdHVzKHN0YXR1cyk7Ci0JCWFkZERpYWxvZy51cGRhdGVTdGF0dXNMaW5lKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybUFwcGx5KEluc3RhbGxTdGFuZGluIHN0YW5kaW4pCi0JewotCQlzdGFuZGluLnNldFByb2Nlc3NvckphcnMoaW5zdGFsbC5nZXRQcm9jZXNzb3JKYXJzKCkpOwotCX0KLQotCXByb3RlY3RlZCBJUHJvY2Vzc29ySW5zdGFsbCBnZXRWTUluc3RhbGwoKQotCXsKLQkJcmV0dXJuIGluc3RhbGw7Ci0JfQotCi0JcHJvdGVjdGVkIElQcm9jZXNzb3JUeXBlIGdldFZNSW5zdGFsbFR5cGUoKQotCXsKLQkJcmV0dXJuIGluc3RhbGxUeXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0JewotCQlPYmplY3Qgc291cmNlID0gZS5nZXRTb3VyY2UoKTsKLQkJaWYgKHNvdXJjZSA9PSByZW1vdmVCdXR0b24pCi0JCXsKLQkJCXJlbW92ZSgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpKTsKLQkJfQotCQllbHNlIGlmIChzb3VyY2UgPT0gYWRkQnV0dG9uKQotCQl7Ci0JCQlhZGRFeHRlcm5hbCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpKTsKLQkJfQotCQllbHNlIGlmIChzb3VyY2UgPT0gYWRkV29ya3NwYWNlQnV0dG9uKQotCQl7Ci0JCQlhZGRXb3Jrc3BhY2UoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKSk7Ci0JCX0KLQkJdXBkYXRlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0JewotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRFeHRlcm5hbChJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pCi0JewotCQlJRGlhbG9nU2V0dGluZ3MgZGlhbG9nU2V0dGluZ3MgPSBYU0xEZWJ1Z1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpOwotCQlTdHJpbmcgbGFzdFVzZWRQYXRoID0gZGlhbG9nU2V0dGluZ3MuZ2V0KExBU1RfUEFUSF9TRVRUSU5HKTsKLQkJaWYgKGxhc3RVc2VkUGF0aCA9PSBudWxsKQotCQl7Ci0JCQlsYXN0VXNlZFBhdGggPSAiIjsKLQkJfQotCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKHRhYmxlVmlld2VyLmdldENvbnRyb2woKS5nZXRTaGVsbCgpLCBTV1QuTVVMVEkpOwotCQlkaWFsb2cuc2V0VGV4dChQcm9jZXNzb3JNZXNzYWdlcy5Qcm9jZXNzb3JMaWJyYXJ5QmxvY2tfRmlsZURpYWxvZ19UaXRsZSk7Ci0JCWRpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXQotCQl7ICIqLmphcjsqLnppcCIgfSk7Ci0JCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKGxhc3RVc2VkUGF0aCk7Ci0JCVN0cmluZyByZXMgPSBkaWFsb2cub3BlbigpOwotCQlpZiAocmVzID09IG51bGwpCi0JCXsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmdbXSBmaWxlTmFtZXMgPSBkaWFsb2cuZ2V0RmlsZU5hbWVzKCk7Ci0JCWludCBuQ2hvc2VuID0gZmlsZU5hbWVzLmxlbmd0aDsKLQotCQlJUGF0aCBmaWx0ZXJQYXRoID0gbmV3IFBhdGgoZGlhbG9nLmdldEZpbHRlclBhdGgoKSk7Ci0JCUlQcm9jZXNzb3JKYXJbXSBsaWJzID0gbmV3IElQcm9jZXNzb3JKYXJbbkNob3Nlbl07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbkNob3NlbjsgaSsrKQotCQl7Ci0JCQlsaWJzW2ldID0gWFNMVFJ1bnRpbWUuY3JlYXRlUHJvY2Vzc29ySmFyKGZpbHRlclBhdGguYXBwZW5kKGZpbGVOYW1lc1tpXSkubWFrZUFic29sdXRlKCkpOwotCQl9Ci0JCWRpYWxvZ1NldHRpbmdzLnB1dChMQVNUX1BBVEhfU0VUVElORywgZmlsdGVyUGF0aC50b09TU3RyaW5nKCkpOwotCi0JCUlQcm9jZXNzb3JKYXJbXSBjdXJyZW50SmFycyA9IGluc3RhbGwuZ2V0UHJvY2Vzc29ySmFycygpOwotCQlJUHJvY2Vzc29ySmFyW10gbmV3SmFycyA9IG5ldyBJUHJvY2Vzc29ySmFyW2N1cnJlbnRKYXJzLmxlbmd0aCArIGxpYnMubGVuZ3RoXTsKLQkJU3lzdGVtLmFycmF5Y29weShjdXJyZW50SmFycywgMCwgbmV3SmFycywgMCwgY3VycmVudEphcnMubGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weShsaWJzLCAwLCBuZXdKYXJzLCBjdXJyZW50SmFycy5sZW5ndGgsIGxpYnMubGVuZ3RoKTsKLQkJaW5zdGFsbC5zZXRQcm9jZXNzb3JKYXJzKG5ld0phcnMpOwotCi0JCXRhYmxlVmlld2VyLmFkZChsaWJzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkV29ya3NwYWNlKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikKLQl7Ci0JCUlEaWFsb2dTZXR0aW5ncyBkaWFsb2dTZXR0aW5ncyA9IFhTTERlYnVnVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCVN0cmluZyBsYXN0VXNlZFBhdGggPSBkaWFsb2dTZXR0aW5ncy5nZXQoTEFTVF9XT1JLU1BBQ0VfUEFUSF9TRVRUSU5HKTsKLQkJSVBhdGggbGFzdFBhdGggPSBudWxsOwotCQlpZiAobGFzdFVzZWRQYXRoICE9IG51bGwpCi0JCXsKLQkJCWxhc3RQYXRoID0gUGF0aC5mcm9tUG9ydGFibGVTdHJpbmcobGFzdFVzZWRQYXRoKTsKLQkJfQotCi0JCS8vIElSZXNvdXJjZSBjdXJyZW50UmVzb3VyY2UgPSBnZXRSZXNvdXJjZSgpOwotCQlFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBuZXcgRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2codGFibGVWaWV3ZXIuZ2V0Q29udHJvbCgpLmdldFNoZWxsKCksIG5ldyBXb3JrYmVuY2hMYWJlbFByb3ZpZGVyKCksIG5ldyBXb3JrYmVuY2hDb250ZW50UHJvdmlkZXIoKSk7Ci0JCWRpYWxvZy5zZXRUaXRsZShQcm9jZXNzb3JNZXNzYWdlcy5Qcm9jZXNzb3JMaWJyYXJ5QmxvY2tfV29ya3NwYWNlRmlsZURpYWxvZ19UaXRsZSk7Ci0JCWRpYWxvZy5zZXRNZXNzYWdlKFByb2Nlc3Nvck1lc3NhZ2VzLlByb2Nlc3NvckxpYnJhcnlCbG9ja19Xb3Jrc3BhY2VGaWxlRGlhbG9nX01lc3NhZ2UpOwotCQlkaWFsb2cuc2V0VmFsaWRhdG9yKHZhbGlkYXRvcik7Ci0JCWRpYWxvZy5hZGRGaWx0ZXIobmV3IFZpZXdlckZpbHRlcigpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnRFbGVtZW50LCBPYmplY3QgZWxlbWVudCkKLQkJCXsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElDb250YWluZXIpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRmlsZSkKLQkJCQl7Ci0JCQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIGVsZW1lbnQ7Ci0JCQkJCVN0cmluZyBleHRlbnNpb24gPSBmaWxlLmdldEZpbGVFeHRlbnNpb24oKTsKLQkJCQkJaWYgKGV4dGVuc2lvbiA9PSBudWxsKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQlyZXR1cm4gZXh0ZW5zaW9uLmVxdWFscygiamFyIik7Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfSk7Ci0JCWRpYWxvZy5zZXRJbnB1dChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLQkJaWYgKGxhc3RQYXRoICE9IG51bGwpCi0JCQlkaWFsb2cuc2V0SW5pdGlhbFNlbGVjdGlvbihsYXN0UGF0aCk7Ci0JCWRpYWxvZy5zZXRDb21wYXJhdG9yKG5ldyBSZXNvdXJjZUNvbXBhcmF0b3IoUmVzb3VyY2VDb21wYXJhdG9yLk5BTUUpKTsKLQkJZGlhbG9nLnNldEFsbG93TXVsdGlwbGUodHJ1ZSk7Ci0KLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKQotCQl7Ci0JCQlPYmplY3RbXSBlbGVtZW50cyA9IGRpYWxvZy5nZXRSZXN1bHQoKTsKLQkJCWlmIChlbGVtZW50cy5sZW5ndGggPiAwKQotCQkJewotCQkJCUlQcm9jZXNzb3JKYXJbXSBsaWJzID0gbmV3IElQcm9jZXNzb3JKYXJbZWxlbWVudHMubGVuZ3RoXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotCQkJCXsKLQkJCQkJSUZpbGUgamFyID0gKElGaWxlKSBlbGVtZW50c1tpXTsKLQkJCQkJbGlic1tpXSA9IFhTTFRSdW50aW1lLmNyZWF0ZVByb2Nlc3NvckphcihqYXIuZ2V0RnVsbFBhdGgoKSk7Ci0JCQkJfQotCQkJCUlQcm9jZXNzb3JKYXJbXSBjdXJyZW50SmFycyA9IGluc3RhbGwuZ2V0UHJvY2Vzc29ySmFycygpOwotCQkJCUlQcm9jZXNzb3JKYXJbXSBuZXdKYXJzID0gbmV3IElQcm9jZXNzb3JKYXJbY3VycmVudEphcnMubGVuZ3RoICsgbGlicy5sZW5ndGhdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkoY3VycmVudEphcnMsIDAsIG5ld0phcnMsIDAsIGN1cnJlbnRKYXJzLmxlbmd0aCk7Ci0JCQkJU3lzdGVtLmFycmF5Y29weShsaWJzLCAwLCBuZXdKYXJzLCBjdXJyZW50SmFycy5sZW5ndGgsIGxpYnMubGVuZ3RoKTsKLQkJCQlpbnN0YWxsLnNldFByb2Nlc3NvckphcnMobmV3SmFycyk7Ci0KLQkJCQl0YWJsZVZpZXdlci5hZGQobGlicyk7Ci0KLQkJCQlsYXN0UGF0aCA9IGxpYnNbMF0uZ2V0UGF0aCgpOwotCQkJCWxhc3RQYXRoID0gbGFzdFBhdGgudXB0b1NlZ21lbnQobGFzdFBhdGguc2VnbWVudENvdW50KCkpOwotCQkJCWRpYWxvZ1NldHRpbmdzLnB1dChMQVNUX1dPUktTUEFDRV9QQVRIX1NFVFRJTkcsIGxhc3RQYXRoLnRvUG9ydGFibGVTdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikKLQl7Ci0JCUxpc3Q8SVByb2Nlc3Nvckphcj4gY3VycmVudEphcnMgPSBuZXcgQXJyYXlMaXN0PElQcm9jZXNzb3JKYXI+KEFycmF5cy5hc0xpc3QoaW5zdGFsbC5nZXRQcm9jZXNzb3JKYXJzKCkpKTsKLQkJZm9yIChJdGVyYXRvcjw/PiBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLQkJewotCQkJY3VycmVudEphcnMucmVtb3ZlKGl0ZXIubmV4dCgpKTsKLQkJfQotCQlpbnN0YWxsLnNldFByb2Nlc3NvckphcnMoKElQcm9jZXNzb3JKYXJbXSkgY3VycmVudEphcnMudG9BcnJheShuZXcgSVByb2Nlc3NvckphclswXSkpOwotCQl0YWJsZVZpZXdlci5yZW1vdmUoc2VsZWN0aW9uLnRvQXJyYXkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0JewotCQl1cGRhdGVCdXR0b25zKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUJ1dHRvbnMoKQotCXsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoIXNlbGVjdGlvbi5pc0VtcHR5KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9wcmVmZXJlbmNlcy9Qcm9jZXNzb3JzUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9wcmVmZXJlbmNlcy9Qcm9jZXNzb3JzUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE5ODA0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvcHJlZmVyZW5jZXMvUHJvY2Vzc29yc1ByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuWFNMRGVidWdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5JUHJvY2Vzc29ySW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5YU0xUUnVudGltZTsKLQotcHVibGljIGNsYXNzIFByb2Nlc3NvcnNQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlCi17Ci0JcHJpdmF0ZSBJbnN0YWxsZWRQcm9jZXNzb3JzQmxvY2sgcHJvY2Vzc29yc0Jsb2NrOwotCi0JcHVibGljIFByb2Nlc3NvcnNQcmVmZXJlbmNlUGFnZSgpCi0JewotCQlzdXBlcigpOwotCQkvLyBvbmx5IHVzZWQgd2hlbiBwYWdlIGlzIHNob3duIHByb2dyYW1hdGljYWxseQotCQlzZXRUaXRsZSgiSmF2YSBYU0xUIFByb2Nlc3NvcnMiKTsKLQkJc2V0RGVzY3JpcHRpb24oIkFkZCwgcmVtb3ZlIG9yIGVkaXQgWFNMVCBwcm9jZXNzb3IgZGVmaW5pdGlvbnMuXG5CeSBkZWZhdWx0LCB0aGUgY2hlY2tlZCBQcm9jZXNzb3IgaXMgdXNlZCBmb3IgYWxsIHRyYW5zZm9ybWF0aW9ucy4iKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKQotCXsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgYW5jZXN0b3IpCi0JewotCQlpbml0aWFsaXplRGlhbG9nVW5pdHMoYW5jZXN0b3IpOwotCi0JCW5vRGVmYXVsdEFuZEFwcGx5QnV0dG9uKCk7Ci0KLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlhbmNlc3Rvci5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlwcm9jZXNzb3JzQmxvY2sgPSBuZXcgSW5zdGFsbGVkUHJvY2Vzc29yc0Jsb2NrKCk7Ci0JCXByb2Nlc3NvcnNCbG9jay5jcmVhdGVDb250cm9sKGFuY2VzdG9yKTsKLQkJQ29udHJvbCBjb250cm9sID0gcHJvY2Vzc29yc0Jsb2NrLmdldENvbnRyb2woKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMTsKLQkJY29udHJvbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8vIFRPRE8gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscC4uLgotCi0JCWluaXREZWZhdWx0SW5zdGFsbCgpOwotCQlwcm9jZXNzb3JzQmxvY2suYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkKLQkJewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0JCQl7Ci0JCQkJSVByb2Nlc3Nvckluc3RhbGwgaW5zdGFsbCA9IGdldEN1cnJlbnREZWZhdWx0UHJvY2Vzc29yKCk7Ci0JCQkJaWYgKGluc3RhbGwgPT0gbnVsbCkKLQkJCQl7Ci0JCQkJCXNldFZhbGlkKGZhbHNlKTsKLQkJCQkJc2V0RXJyb3JNZXNzYWdlKCJTZWxlY3QgYSBkZWZhdWx0IFhTTFQgUHJvY2Vzc29yIik7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCXNldFZhbGlkKHRydWUpOwotCQkJCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJYXBwbHlEaWFsb2dGb250KGFuY2VzdG9yKTsKLQkJcmV0dXJuIGFuY2VzdG9yOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpCi0JewotCQlwcm9jZXNzb3JzQmxvY2suc2F2ZUNvbHVtblNldHRpbmdzKCk7Ci0JCWZpbmFsIGJvb2xlYW5bXSBvayA9IG5ldyBib29sZWFuWzFdOwotCQl0cnkKLQkJewotCQkJZmluYWwgSVByb2Nlc3Nvckluc3RhbGxbXSBpbnN0YWxscyA9IHByb2Nlc3NvcnNCbG9jay5nZXRQcm9jZXNzb3JzKCk7Ci0JCQlmaW5hbCBJUHJvY2Vzc29ySW5zdGFsbCBkZWZhdWx0UHJvY2Vzc29yID0gZ2V0Q3VycmVudERlZmF1bHRQcm9jZXNzb3IoKTsKLQkJCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKQotCQkJewotCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotCQkJCXsKLQkJCQkJdHJ5Ci0JCQkJCXsKLQkJCQkJCVhTTFRSdW50aW1lLnNhdmVQcm9jZXNzb3JQcmVmZXJlbmNlcyhpbnN0YWxscyxkZWZhdWx0UHJvY2Vzc29yLG1vbml0b3IpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0JCQkJCXsKLQkJCQkJCVhTTERlYnVnVUlQbHVnaW4ubG9nKGUpOwotCQkJCQl9Ci0JCQkJCW9rWzBdID0gIW1vbml0b3IuaXNDYW5jZWxlZCgpOwotCQkJCX0KLQkJCX07Ci0JCQlYU0xEZWJ1Z1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKS5idXN5Q3Vyc29yV2hpbGUocnVubmFibGUpOwotCQl9Ci0JCWNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpCi0JCXsKLQkJCVhTTERlYnVnVUlQbHVnaW4ubG9nKGUpOwotCQl9Ci0JCWNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQlYU0xEZWJ1Z1VJUGx1Z2luLmxvZyhlKTsKLQkJfQotCQlyZXR1cm4gb2tbMF07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXREZWZhdWx0SW5zdGFsbCgpCi0JewotCQlJUHJvY2Vzc29ySW5zdGFsbCByZWFsRGVmYXVsdCA9IFhTTFRSdW50aW1lLmdldERlZmF1bHRQcm9jZXNzb3IoKTsKLQkJaWYgKHJlYWxEZWZhdWx0ICE9IG51bGwpCi0JCXsKLQkJCUlQcm9jZXNzb3JJbnN0YWxsW10gaW5zdGFsbHMgPSBwcm9jZXNzb3JzQmxvY2suZ2V0UHJvY2Vzc29ycygpOwotCQkJZm9yIChJUHJvY2Vzc29ySW5zdGFsbCBmYWtlSW5zdGFsbCA6IGluc3RhbGxzKQotCQkJewotCQkJCWlmIChmYWtlSW5zdGFsbC5nZXRJZCgpLmVxdWFscyhyZWFsRGVmYXVsdC5nZXRJZCgpKSkKLQkJCQl7Ci0JCQkJCXZlcmlmeURlZmF1bHRWTShmYWtlSW5zdGFsbCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlEZWZhdWx0Vk0oSVByb2Nlc3Nvckluc3RhbGwgaW5zdGFsbCkKLQl7Ci0JCWlmIChpbnN0YWxsICE9IG51bGwpCi0JCXsKLQkJCXByb2Nlc3NvcnNCbG9jay5zZXRDaGVja2VkSW5zdGFsbChpbnN0YWxsKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXByb2Nlc3NvcnNCbG9jay5zZXRDaGVja2VkSW5zdGFsbChudWxsKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSVByb2Nlc3Nvckluc3RhbGwgZ2V0Q3VycmVudERlZmF1bHRQcm9jZXNzb3IoKQotCXsKLQkJcmV0dXJuIHByb2Nlc3NvcnNCbG9jay5nZXRDaGVja2VkSW5zdGFsbCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvZm9ybWF0dGVyL0ZPRm9ybWF0dGVyVGFiLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9mb3JtYXR0ZXIvRk9Gb3JtYXR0ZXJUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVhZmIyNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9mb3JtYXR0ZXIvRk9Gb3JtYXR0ZXJUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5mb3JtYXR0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoQ29uZmlndXJhdGlvblRhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuWFNMTGF1bmNoQ29uZmlndXJhdGlvblRhYjsKLQotcHVibGljIGNsYXNzIEZPRm9ybWF0dGVyVGFiIGV4dGVuZHMgWFNMTGF1bmNoQ29uZmlndXJhdGlvblRhYgotewotCXByaXZhdGUgZmluYWwgWFNMRk9Db21ib0Jsb2NrIHhzbGZvQmxvY2s7Ci0JcHJpdmF0ZSBmaW5hbCBSZW5kZXJlckNvbmZpZ3VyYXRpb25CbG9jayBjb25maWdCbG9jazsKLQotCXB1YmxpYyBGT0Zvcm1hdHRlclRhYigpCi0JewotCQl4c2xmb0Jsb2NrID0gbmV3IFhTTEZPQ29tYm9CbG9jaygpOwotCQljb25maWdCbG9jayA9IG5ldyBSZW5kZXJlckNvbmZpZ3VyYXRpb25CbG9jaygpOwotCQlzZXRCbG9ja3MobmV3IElMYXVuY2hDb25maWd1cmF0aW9uVGFiW10KLQkJeyBjb25maWdCbG9jayB9KTsKLQl9Ci0KLQlwcml2YXRlIGZpbmFsIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGZDaGVja0xpc3RlbmVyID0gbmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkKLQl7Ci0JCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpCi0JCXsKLQkJCWhhbmRsZVNlbGVjdGlvbkNoYW5nZWQoKTsKLQkJfQotCX07Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpCi0JewotCQlzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0JCUNvbXBvc2l0ZSBjb21wID0gKENvbXBvc2l0ZSkgZ2V0Q29udHJvbCgpOwotCi0JCXhzbGZvQmxvY2suY3JlYXRlQ29udHJvbChjb21wKTsKLQkJQ29udHJvbCBjb250cm9sID0geHNsZm9CbG9jay5nZXRDb250cm9sKCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWNvbnRyb2wuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJY29uZmlnQmxvY2suY3JlYXRlQ29udHJvbChjb21wKTsKLQotCQkvLyB1c2VmdWwgYml0IG9mIGNvZGUgaWYgeW91IHdhbnQgdG8gZGlzcGxheSBleHRyYSBvcHRpb25zIHdoZW4gYQotCQkvLyBwYXJ0aWN1bGFyIHByb2Nlc3NvciBpcyBjaG9zZW4KLQotCQkvLyBDb21wb3NpdGUgZHluVGFiQ29tcCA9IG5ldyBDb21wb3NpdGUodG9wQ29tcCwgU1dULk5PTkUpOwotCQkvLyBkeW5UYWJDb21wLnNldEZvbnQoZm9udCk7Ci0JCS8vCQkKLQkJLy8gc2V0RHluYW1pY1RhYkhvbGRlcihkeW5UYWJDb21wKTsKLQkJLy8gR3JpZExheW91dCB0YWJIb2xkZXJMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkvLyB0YWJIb2xkZXJMYXlvdXQubWFyZ2luSGVpZ2h0PSAwOwotCQkvLyB0YWJIb2xkZXJMYXlvdXQubWFyZ2luV2lkdGg9IDA7Ci0JCS8vIHRhYkhvbGRlckxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJLy8gZ2V0RHluYW1pY1RhYkhvbGRlcigpLnNldExheW91dCh0YWJIb2xkZXJMYXlvdXQpOwotCQkvLyBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkvLyBnZXREeW5hbWljVGFiSG9sZGVyKCkuc2V0TGF5b3V0RGF0YShnZCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdHMoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uKQotCXsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKQotCXsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBwZXJmb3JtQXBwbHkoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uKQotCXsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkJcmV0dXJuICJGb3JtYXR0ZXIiOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVNlbGVjdGlvbkNoYW5nZWQoKQotCXsKLQotCQl1cGRhdGVMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9mb3JtYXR0ZXIvUmVuZGVyZXJDb25maWd1cmF0aW9uQmxvY2suamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL2Zvcm1hdHRlci9SZW5kZXJlckNvbmZpZ3VyYXRpb25CbG9jay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjZlOTUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL2Zvcm1hdHRlci9SZW5kZXJlckNvbmZpZ3VyYXRpb25CbG9jay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLmZvcm1hdHRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuUmVzb3VyY2VTZWxlY3Rpb25CbG9jazsKLQotcHVibGljIGNsYXNzIFJlbmRlcmVyQ29uZmlndXJhdGlvbkJsb2NrIGV4dGVuZHMgUmVzb3VyY2VTZWxlY3Rpb25CbG9jawotewotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCQlyZXR1cm4gIkNvbmZpZ3VyYXRpb24iOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pCi0JewotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1BcHBseShJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24pCi0JewotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRzKElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlndXJhdGlvbikKLQl7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNZXNzYWdlKGludCB0eXBlKQotCXsKLQkJcmV0dXJuICIiICsgdHlwZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0UmVzb3VyY2UoKQotCXsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9mb3JtYXR0ZXIvUmVuZGVyZXJUYWJNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvZm9ybWF0dGVyL1JlbmRlcmVyVGFiTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk3YmIxZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9mb3JtYXR0ZXIvUmVuZGVyZXJUYWJNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLmZvcm1hdHRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBSZW5kZXJlclRhYk1lc3NhZ2VzIGV4dGVuZHMgTkxTCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5yZW5kZXJlci5SZW5kZXJlclRhYk1lc3NhZ2VzIjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhTTEZPQ29tYm9CbG9ja19YU0xGT0dyb3VwVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYU0xGT0NvbWJvQmxvY2tfTm9uZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhTTEZPQ29tYm9CbG9ja19TcGVjaWZpY1hTTEZPUHJvY2Vzc29yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgWFNMRk9Db21ib0Jsb2NrX01hbmFnZVhTTEZPUHJvY2Vzc29yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3V0cHV0QmxvY2tfWE1MQnV0dG9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3V0cHV0QmxvY2tfRk9CdXR0b247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPdXRwdXRCbG9ja19IVE1MQnV0dG9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3V0cHV0QmxvY2tfT3V0cHV0RmlsZXNHcm91cFRpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3V0cHV0QmxvY2tfT3V0cHV0VHlwZUdyb3VwVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVUklSZXNvbHZlckJsb2NrX1dvcmtpbmdfRGlyZWN0b3J5Xzg7Ci0KLQlzdGF0aWMKLQl7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBSZW5kZXJlclRhYk1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL2Zvcm1hdHRlci9SZW5kZXJlclRhYk1lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9mb3JtYXR0ZXIvUmVuZGVyZXJUYWJNZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2Y0MjQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL2Zvcm1hdHRlci9SZW5kZXJlclRhYk1lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1YU0xGT0NvbWJvQmxvY2tfWFNMRk9Hcm91cFRpdGxlPVhTTEZPIFByb2Nlc3NvcgotWFNMRk9Db21ib0Jsb2NrX05vbmU9Tm9uZQotWFNMRk9Db21ib0Jsb2NrX1NwZWNpZmljWFNMRk9Qcm9jZXNzb3I9QWx0ZXJuYXRlIFByb2Nlc3NvcjoKLVhTTEZPQ29tYm9CbG9ja19NYW5hZ2VYU0xGT1Byb2Nlc3Nvcj1JbnN0YWxsZWQgRk8gUHJvY2Vzc29ycwotCi1PdXRwdXRCbG9ja19IVE1MQnV0dG9uPUhUTUwKLU91dHB1dEJsb2NrX1hNTEJ1dHRvbj1YTUwKLU91dHB1dEJsb2NrX0ZPQnV0dG9uPVhTTEZPIChQREYvUG9zdHNjcmlwdCkKLU91dHB1dEJsb2NrX091dHB1dFR5cGVHcm91cFRpdGxlPU91dHB1dCBUeXBlCi1PdXRwdXRCbG9ja19PdXRwdXRGaWxlc0dyb3VwVGl0bGU9T3V0cHV0IEZpbGUocykKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL2Zvcm1hdHRlci9YU0xGT0NvbWJvQmxvY2suamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL2Zvcm1hdHRlci9YU0xGT0NvbWJvQmxvY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQzODEzOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9mb3JtYXR0ZXIvWFNMRk9Db21ib0Jsb2NrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLmZvcm1hdHRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuYWN0aW9ucy5Db250cm9sQWNjZXNzaWJsZUxpc3RlbmVyOwotCi1wdWJsaWMgY2xhc3MgWFNMRk9Db21ib0Jsb2NrCi17Ci0JcHJpdmF0ZSBDb21wb3NpdGUgZkNvbnRyb2w7Ci0JcHJpdmF0ZSBCdXR0b24gbm9uZUJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBhbHRlcm5hdGVCdXR0b247Ci0JcHJpdmF0ZSBDb21ibyBhbHRlcm5hdGVDb21ibzsKLQlwcml2YXRlIEJ1dHRvbiBtYW5hZ2VCdXR0b247Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBhbmNlc3RvcikKLQl7Ci0JCUZvbnQgZm9udCA9IGFuY2VzdG9yLmdldEZvbnQoKTsKLQkJQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKGFuY2VzdG9yLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJY29tcC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJY29tcC5zZXRGb250KGZvbnQpOwotCQlmQ29udHJvbCA9IGNvbXA7Ci0KLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoY29tcCwgU1dULk5VTEwpOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWdyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJZ3JvdXAuc2V0Rm9udChmb250KTsKLQotCQlHcmlkRGF0YSBkYXRhOwotCQlncm91cC5zZXRUZXh0KFJlbmRlcmVyVGFiTWVzc2FnZXMuWFNMRk9Db21ib0Jsb2NrX1hTTEZPR3JvdXBUaXRsZSk7Ci0KLQkJbm9uZUJ1dHRvbiA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5SQURJTyk7Ci0JCW5vbmVCdXR0b24uc2V0VGV4dChSZW5kZXJlclRhYk1lc3NhZ2VzLlhTTEZPQ29tYm9CbG9ja19Ob25lKTsKLQkJbm9uZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLQkJCXsKLQkJCQlpZiAobm9uZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkKLQkJCQl7Ci0JCQkJCS8vIHNldFVzZURlZmF1bHQoKTsKLQkJCQkJLy8gc2V0U3RhdHVzKE9LX1NUQVRVUyk7Ci0JCQkJCS8vIGZpcmVQcm9wZXJ0eUNoYW5nZSgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCW5vbmVCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJbm9uZUJ1dHRvbi5zZXRGb250KGZvbnQpOwotCi0JCWFsdGVybmF0ZUJ1dHRvbiA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5SQURJTyk7Ci0JCWFsdGVybmF0ZUJ1dHRvbi5zZXRUZXh0KFJlbmRlcmVyVGFiTWVzc2FnZXMuWFNMRk9Db21ib0Jsb2NrX1NwZWNpZmljWFNMRk9Qcm9jZXNzb3IpOwotCQlhbHRlcm5hdGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0JCQl7Ci0JCQkJaWYgKGFsdGVybmF0ZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkKLQkJCQl7Ci0JCQkJCS8vIGZDb21iby5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkvLyBpZiAoZkNvbWJvLmdldFRleHQoKS5sZW5ndGgoKSA9PSAwICYmICFmVk1zLmlzRW1wdHkoKSkgewotCQkJCQkvLyBmQ29tYm8uc2VsZWN0KDApOwotCQkJCQkvLyB9Ci0JCQkJCS8vIGlmIChmVk1zLmlzRW1wdHkoKSkgewotCQkJCQkvLyBzZXRFcnJvcihPdXRwdXRUYWJNZXNzYWdlcy5Qcm9jZXNzb3JzQ29tYm9CbG9ja18wKTsKLQkJCQkJLy8gfSBlbHNlIHsKLQkJCQkJLy8gc2V0U3RhdHVzKE9LX1NUQVRVUyk7Ci0JCQkJCS8vIH0KLQkJCQkJLy8gZmlyZVByb3BlcnR5Q2hhbmdlKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlhbHRlcm5hdGVCdXR0b24uc2V0Rm9udChmb250KTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQlhbHRlcm5hdGVCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlhbHRlcm5hdGVDb21ibyA9IG5ldyBDb21ibyhncm91cCwgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOwotCQlhbHRlcm5hdGVDb21iby5zZXRGb250KGZvbnQpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQlhbHRlcm5hdGVDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlDb250cm9sQWNjZXNzaWJsZUxpc3RlbmVyLmFkZExpc3RlbmVyKGFsdGVybmF0ZUNvbWJvLCBhbHRlcm5hdGVCdXR0b24uZ2V0VGV4dCgpKTsKLQotCQlhbHRlcm5hdGVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLQkJCXsKLQkJCQkvLyBmaXJlUHJvcGVydHlDaGFuZ2UoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJbWFuYWdlQnV0dG9uID0gbmV3IEJ1dHRvbihncm91cCwgU1dULlBVU0gpOwotCQltYW5hZ2VCdXR0b24uc2V0VGV4dChSZW5kZXJlclRhYk1lc3NhZ2VzLlhTTEZPQ29tYm9CbG9ja19NYW5hZ2VYU0xGT1Byb2Nlc3Nvcik7Ci0JCW1hbmFnZUJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKQotCQl7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkKLQkJCXsKLQkJCQkvLyBJUHJlZmVyZW5jZVBhZ2UgcGFnZSA9IG5ldyBQcm9jZXNzb3JzUHJlZmVyZW5jZVBhZ2UoKTsKLQkJCQkvLyBzaG93UHJlZlBhZ2UoIm9yZy5lY2xpcHNlLndzdC54c2x0LmxhdW5jaGluZy51aS5wcmVmZXJlbmNlcy5Qcm9jZXNzb3JQcmVmZXJlbmNlUGFnZSIsCi0JCQkJLy8gcGFnZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKQotCXsKLQkJcmV0dXJuIGZDb250cm9sOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL21haW4vSVBhcmFtZXRlcnNDaGFuZ2VkTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL21haW4vSVBhcmFtZXRlcnNDaGFuZ2VkTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNkOGE3MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9tYWluL0lQYXJhbWV0ZXJzQ2hhbmdlZExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMubWFpbjsKLQotcHVibGljIGludGVyZmFjZSBJUGFyYW1ldGVyc0NoYW5nZWRMaXN0ZW5lcgotewotCXZvaWQgcGFyYW1ldGVyc0NoYW5nZWQoUGFyYW1ldGVyVmlld2VyIHZpZXdlcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9tYWluL0lTdHlsZXNoZWV0RW50cmllc0NoYW5nZWRMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvbWFpbi9JU3R5bGVzaGVldEVudHJpZXNDaGFuZ2VkTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFmZTc5OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9tYWluL0lTdHlsZXNoZWV0RW50cmllc0NoYW5nZWRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLm1haW47Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVN0eWxlc2hlZXRFbnRyaWVzQ2hhbmdlZExpc3RlbmVyCi17Ci0Jdm9pZCBlbnRyaWVzQ2hhbmdlZChTdHlsZXNoZWV0Vmlld2VyIHZpZXdlcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9tYWluL0lucHV0RmlsZUJsb2NrLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9tYWluL0lucHV0RmlsZUJsb2NrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMjFlMjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvbWFpbi9JbnB1dEZpbGVCbG9jay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5tYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS52YXJpYWJsZXMuSVN0cmluZ1ZhcmlhYmxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnZhcmlhYmxlcy5WYXJpYWJsZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5SZXNvdXJjZVNlbGVjdGlvbkJsb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuWFNMRGVidWdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5YU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZU1hdGNoZXI7Ci0KLXB1YmxpYyBjbGFzcyBJbnB1dEZpbGVCbG9jayBleHRlbmRzIFJlc291cmNlU2VsZWN0aW9uQmxvY2sKLXsKLQlwcml2YXRlIGZpbmFsIElGaWxlIGRlZmF1bHRGaWxlOwotCUlDb250ZW50VHlwZU1hbmFnZXIgY29udGVudFR5cGVNYW5hZ2VyID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCk7Ci0KLQlwdWJsaWMgSW5wdXRGaWxlQmxvY2soSUZpbGUgZGVmYXVsdEZpbGUpCi0JewotCQlzdXBlcihJUmVzb3VyY2UuRklMRSwgZmFsc2UpOwotCQl0aGlzLmRlZmF1bHRGaWxlID0gZGVmYXVsdEZpbGU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEZpbGVFeHRlbnNpb25zKCkKLQl7Ci0JCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlTWFuYWdlci5nZXRDb250ZW50VHlwZSgib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhtbHNvdXJjZSIpOwotCQlTdHJpbmdbXSB4bWxDb250ZW50VHlwZXMgPSBjb250ZW50VHlwZS5nZXRGaWxlU3BlY3MoSUNvbnRlbnRUeXBlLkZJTEVfRVhURU5TSU9OX1NQRUMpOwotCQkKLQkJcmV0dXJuIHhtbENvbnRlbnRUeXBlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0cyhJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24pCi0JewotCQlTdHJpbmcgcGF0aCA9ICIiOwotCQlpZiAoZGVmYXVsdEZpbGUgIT0gbnVsbCkKLQkJCXBhdGggPSBWYXJpYWJsZXNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0cmluZ1ZhcmlhYmxlTWFuYWdlcigpLmdlbmVyYXRlVmFyaWFibGVFeHByZXNzaW9uKCJ3b3Jrc3BhY2VfbG9jIiwgZGVmYXVsdEZpbGUuZ2V0RnVsbFBhdGgoKS50b1BvcnRhYmxlU3RyaW5nKCkpOwotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfSU5QVVRfRklMRSwgcGF0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikKLQl7Ci0JCXNldExhdW5jaENvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbik7Ci0JCXRyeQotCQl7Ci0JCQlTdHJpbmcgd2QgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfSU5QVVRfRklMRSwgKFN0cmluZykgbnVsbCk7Ci0JCQlpZiAod2QgIT0gbnVsbCkKLQkJCXsKLQkJCQlzZXRUZXh0KHdkKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotCQl7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoTWFpblRhYk1lc3NhZ2VzLklucHV0RmlsZUJsb2NrX0V4Y2VwdGlvbl9vY2N1cnJlZF9yZWFkaW5nX2NvbmZpZ3VyYXRpb24gKyBlLmdldFN0YXR1cygpLmdldE1lc3NhZ2UoKSk7Ci0JCQlYU0xEZWJ1Z1VJUGx1Z2luLmxvZyhlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1BcHBseShJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24pCi0JewotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfSU5QVVRfRklMRSwgZ2V0VGV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkJcmV0dXJuIE1haW5UYWJNZXNzYWdlcy5JbnB1dEZpbGVCbG9ja19OYW1lOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRSZXNvdXJjZSgpCi0JewotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRleHRNb2RpZmllZCgpCi0JewotCQlJUGF0aCBwYXRoID0gbnVsbDsKLQkJU3RyaW5nIHdvcmtpbmdEaXJQYXRoID0gZ2V0VGV4dCgpOwotCQlpZiAod29ya2luZ0RpclBhdGguaW5kZXhPZigiJHsiKSA+PSAwKQotCQl7Ci0JCQlJU3RyaW5nVmFyaWFibGVNYW5hZ2VyIG1hbmFnZXIgPSBWYXJpYWJsZXNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0cmluZ1ZhcmlhYmxlTWFuYWdlcigpOwotCQkJdHJ5Ci0JCQl7Ci0JCQkJbWFuYWdlci52YWxpZGF0ZVN0cmluZ1ZhcmlhYmxlcyh3b3JraW5nRGlyUGF0aCk7Ci0JCQkJcGF0aCA9IG5ldyBQYXRoKG1hbmFnZXIucGVyZm9ybVN0cmluZ1N1YnN0aXR1dGlvbih3b3JraW5nRGlyUGF0aCkpOwotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLQkJCXsKLQkJCX0KLQkJfQotCQllbHNlIGlmICh3b3JraW5nRGlyUGF0aC5sZW5ndGgoKSA+IDApCi0JCXsKLQkJCXBhdGggPSBuZXcgUGF0aCh3b3JraW5nRGlyUGF0aCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1lc3NhZ2UoaW50IHR5cGUpCi0JewotCQlzd2l0Y2ggKHR5cGUpCi0JCXsKLQkJCWNhc2UgRVJST1JfRElSRUNUT1JZX05PVF9TUEVDSUZJRUQ6Ci0JCQkJcmV0dXJuIE1haW5UYWJNZXNzYWdlcy5JbnB1dEZpbGVCbG9ja19ESVJFQ1RPUllfTk9UX1NQRUNJRklFRDsKLQkJCWNhc2UgRVJST1JfRElSRUNUT1JZX0RPRVNfTk9UX0VYSVNUOgotCQkJCXJldHVybiBNYWluVGFiTWVzc2FnZXMuSW5wdXRGaWxlQmxvY2tfRElSRUNUT1JZX0RPRVNfTk9UX0VYSVNUOwotCQkJY2FzZSBHUk9VUF9OQU1FOgotCQkJCXJldHVybiBNYWluVGFiTWVzc2FnZXMuSW5wdXRGaWxlQmxvY2tfR1JPVVBfTkFNRTsKLQkJCWNhc2UgVVNFX0RFRkFVTFRfUkFESU86Ci0JCQkJcmV0dXJuIE1haW5UYWJNZXNzYWdlcy5JbnB1dEZpbGVCbG9ja19ERUZBVUxUX1JBRElPOwotCQkJY2FzZSBVU0VfT1RIRVJfUkFESU86Ci0JCQkJcmV0dXJuIE1haW5UYWJNZXNzYWdlcy5JbnB1dEZpbGVCbG9ja19PVEhFUl9SQURJTzsKLQkJCWNhc2UgRElSRUNUT1JZX0RJQUxPR19NRVNTQUdFOgotCQkJCXJldHVybiBNYWluVGFiTWVzc2FnZXMuSW5wdXRGaWxlQmxvY2tfRElBTE9HX01FU1NBR0U7Ci0JCQljYXNlIFdPUktTUEFDRV9ESUFMT0dfTUVTU0FHRToKLQkJCQlyZXR1cm4gTWFpblRhYk1lc3NhZ2VzLklucHV0RmlsZUJsb2NrX1dPUktTUEFDRV9ESUFMT0dfTUVTU0FHRTsKLQkJCWNhc2UgVkFSSUFCTEVTX0JVVFRPTjoKLQkJCQlyZXR1cm4gTWFpblRhYk1lc3NhZ2VzLklucHV0RmlsZUJsb2NrX1ZBUklBQkxFU19CVVRUT047Ci0JCQljYXNlIEZJTEVfU1lTVEVNX0JVVFRPTjoKLQkJCQlyZXR1cm4gTWFpblRhYk1lc3NhZ2VzLklucHV0RmlsZUJsb2NrX0ZJTEVfU1lTVEVNX0JVVFRPTjsKLQkJCWNhc2UgV09SS1NQQUNFX0JVVFRPTjoKLQkJCQlyZXR1cm4gTWFpblRhYk1lc3NhZ2VzLklucHV0RmlsZUJsb2NrX1dPUktTUEFDRV9CVVRUT047Ci0JCQljYXNlIFdPUktTUEFDRV9ESUFMT0dfVElUTEU6Ci0JCQkJcmV0dXJuIE1haW5UYWJNZXNzYWdlcy5JbnB1dEZpbGVCbG9ja19XT1JLU1BBQ0VfRElBTE9HX1RJVExFOwotCQl9Ci0JCXJldHVybiAiIiArIHR5cGU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlUmVzb3VyY2VUZXh0KGJvb2xlYW4gdXNlRGVmYXVsdCkKLQl7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvbWFpbi9NYWluVGFiTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL21haW4vTWFpblRhYk1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyOTkzMjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvbWFpbi9NYWluVGFiTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMubWFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBNYWluVGFiTWVzc2FnZXMgZXh0ZW5kcyBOTFMKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLm1haW4uTWFpblRhYk1lc3NhZ2VzIjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhTTE1haW5UYWJfTGFiZWxUZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3R5bGVzaGVldEVudHJ5TGFiZWxQcm92aWRlcl9JbnZhbGlkX3BhdGg7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYU0xNYWluVGFiX1Byb2plY3RfR3JvdXA7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYU0xNYWluVGFiX0Jyb3dzZV9Qcm9qZWN0czsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhTTE1haW5UYWJfUHJvamVjdF9Eb2VzX05vdF9FeGlzdDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhTTE1haW5UYWJfUHJvamVjdF9DbG9zZWQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYU0xNYWluVGFiX1Byb2plY3RfTmFtZV9JbnZhbGlkOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgWFNMTWFpblRhYl9DaG9vc2VfUHJvamVjdF9EaWFsb2dfVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYU0xNYWluVGFiX0Nob29zZV9Qcm9qZWN0X0RpYWxvZ19NZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgWFNMTWFpblRhYl9UcmFuc2Zvcm1zX0dyb3VwOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVHJhbnNmb3Jtc0Jsb2NrX05hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnB1dEZpbGVCbG9ja19ESVJFQ1RPUllfTk9UX1NQRUNJRklFRDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElucHV0RmlsZUJsb2NrX0RJUkVDVE9SWV9ET0VTX05PVF9FWElTVDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElucHV0RmlsZUJsb2NrX0dST1VQX05BTUU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnB1dEZpbGVCbG9ja19ERUZBVUxUX1JBRElPOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5wdXRGaWxlQmxvY2tfT1RIRVJfUkFESU87Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnB1dEZpbGVCbG9ja19ESUFMT0dfTUVTU0FHRTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElucHV0RmlsZUJsb2NrX1dPUktTUEFDRV9ESUFMT0dfTUVTU0FHRTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElucHV0RmlsZUJsb2NrX1ZBUklBQkxFU19CVVRUT047Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnB1dEZpbGVCbG9ja19GSUxFX1NZU1RFTV9CVVRUT047Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnB1dEZpbGVCbG9ja19XT1JLU1BBQ0VfQlVUVE9OOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5wdXRGaWxlQmxvY2tfTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElucHV0RmlsZUJsb2NrX0V4Y2VwdGlvbl9vY2N1cnJlZF9yZWFkaW5nX2NvbmZpZ3VyYXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnB1dEZpbGVCbG9ja19XT1JLU1BBQ0VfRElBTE9HX1RJVExFOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgWFNMTWFpblRhYl9UYWJOYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5wdXRGaWxlQmxvY2tfRXhjZXB0aW9uX29jY3VycmVkX3NhdmluZ19jb25maWd1cmF0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3V0cHV0VHlwZUJsb2NrX0dyb3VwX05hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPdXRwdXRGaWxlQmxvY2tfRElSRUNUT1JZX05PVF9TUEVDSUZJRUQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPdXRwdXRGaWxlQmxvY2tfRElSRUNUT1JZX0RPRVNfTk9UX0VYSVNUOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3V0cHV0RmlsZUJsb2NrX0dST1VQX05BTUU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPdXRwdXRGaWxlQmxvY2tfREVGQVVMVF9SQURJTzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE91dHB1dEZpbGVCbG9ja19PVEhFUl9SQURJTzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE91dHB1dEZpbGVCbG9ja19ESUFMT0dfTUVTU0FHRTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE91dHB1dEZpbGVCbG9ja19XT1JLU1BBQ0VfRElBTE9HX01FU1NBR0U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPdXRwdXRGaWxlQmxvY2tfVkFSSUFCTEVTX0JVVFRPTjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE91dHB1dEZpbGVCbG9ja19GSUxFX1NZU1RFTV9CVVRUT047Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPdXRwdXRGaWxlQmxvY2tfV09SS1NQQUNFX0JVVFRPTjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE91dHB1dEZpbGVCbG9ja19OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3V0cHV0RmlsZUJsb2NrX0V4Y2VwdGlvbl9vY2N1cnJlZF9yZWFkaW5nX2NvbmZpZ3VyYXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPdXRwdXRGaWxlQmxvY2tfV09SS1NQQUNFX0RJQUxPR19USVRMRTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE91dHB1dEZpbGVCbG9ja19FeGNlcHRpb25fb2NjdXJyZWRfc2F2aW5nX2NvbmZpZ3VyYXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPdXRwdXRGT0ZpbGVCbG9ja19ESVJFQ1RPUllfTk9UX1NQRUNJRklFRDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE91dHB1dEZPRmlsZUJsb2NrX0RJUkVDVE9SWV9ET0VTX05PVF9FWElTVDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE91dHB1dEZPRmlsZUJsb2NrX0dST1VQX05BTUU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPdXRwdXRGT0ZpbGVCbG9ja19ERUZBVUxUX1JBRElPOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3V0cHV0Rk9GaWxlQmxvY2tfT1RIRVJfUkFESU87Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPdXRwdXRGT0ZpbGVCbG9ja19ESUFMT0dfTUVTU0FHRTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE91dHB1dEZPRmlsZUJsb2NrX1dPUktTUEFDRV9ESUFMT0dfTUVTU0FHRTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE91dHB1dEZPRmlsZUJsb2NrX1ZBUklBQkxFU19CVVRUT047Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPdXRwdXRGT0ZpbGVCbG9ja19GSUxFX1NZU1RFTV9CVVRUT047Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPdXRwdXRGT0ZpbGVCbG9ja19XT1JLU1BBQ0VfQlVUVE9OOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3V0cHV0Rk9GaWxlQmxvY2tfTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE91dHB1dEZPRmlsZUJsb2NrX0V4Y2VwdGlvbl9vY2N1cnJlZF9yZWFkaW5nX2NvbmZpZ3VyYXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPdXRwdXRGT0ZpbGVCbG9ja19XT1JLU1BBQ0VfRElBTE9HX1RJVExFOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3V0cHV0Rk9GaWxlQmxvY2tfRXhjZXB0aW9uX29jY3VycmVkX3NhdmluZ19jb25maWd1cmF0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVHJhbnNmb3Jtc0Jsb2NrX1BhcmFtZXRlcnNMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRyYW5zZm9ybXNCbG9ja19TdHlsZXNoZWV0c0xhYmVsOwotCi0Jc3RhdGljCi0JewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTWFpblRhYk1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL21haW4vTWFpblRhYk1lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9tYWluL01haW5UYWJNZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODg2MzUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL21haW4vTWFpblRhYk1lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi1YU0xNYWluVGFiX0xhYmVsVGV4dD1MaXN0IHN0eWxlc2hlZXRzIGluIHRoZSBvcmRlciB0byBiZSBhcHBsaWVkOgotU3R5bGVzaGVldEVudHJ5TGFiZWxQcm92aWRlcl9JbnZhbGlkX3BhdGg9SW52YWxpZCBwYXRoCi1YU0xNYWluVGFiX1Byb2plY3RfRG9lc19Ob3RfRXhpc3Q9UHJvamVjdCBkb2VzIG5vdCBleGlzdAotWFNMTWFpblRhYl9Qcm9qZWN0X0Nsb3NlZD1Qcm9qZWN0IGlzIGNsb3NlZAotWFNMTWFpblRhYl9Qcm9qZWN0X05hbWVfSW52YWxpZD1Qcm9qZWN0IG5hbWUgaXMgaW52YWxpZAotWFNMTWFpblRhYl9DaG9vc2VfUHJvamVjdF9EaWFsb2dfVGl0bGU9U2VsZWN0IHByb2plY3QKLVhTTE1haW5UYWJfQ2hvb3NlX1Byb2plY3RfRGlhbG9nX01lc3NhZ2U9Q2hvb3NlIGEgcHJvamVjdCB0byBhc3NvY2lhdGUgd2l0aCB0aGlzIGxhdW5jaCBjb25maWd1cmF0aW9uCi1YU0xNYWluVGFiX1Byb2plY3RfR3JvdXA9UHJvamVjdAotWFNMTWFpblRhYl9Ccm93c2VfUHJvamVjdHM9QnJvd3NlCi1YU0xNYWluVGFiX1RhYk5hbWU9TWFpbgotCi1UcmFuc2Zvcm1zQmxvY2tfTmFtZT1UcmFuc2Zvcm1hdGlvbiBQaXBlbGluZQotVHJhbnNmb3Jtc0Jsb2NrX1BhcmFtZXRlcnNMYWJlbD1QYXJhbWV0ZXJzIGZvciBzdHlsZXNoZWV0OgotVHJhbnNmb3Jtc0Jsb2NrX1N0eWxlc2hlZXRzTGFiZWw9U3R5bGVzaGVldHM6Ci0KLUlucHV0RmlsZUJsb2NrX0RJUkVDVE9SWV9OT1RfU1BFQ0lGSUVEPUlucHV0IGZpbGUgbm90IHNwZWNpZmllZAotSW5wdXRGaWxlQmxvY2tfRElSRUNUT1JZX0RPRVNfTk9UX0VYSVNUPUlucHV0IGZpbGUgZG9lcyBub3QgZXhpc3QKLUlucHV0RmlsZUJsb2NrX0dST1VQX05BTUU9WE1MIElucHV0IEZpbGUKLUlucHV0RmlsZUJsb2NrX0RFRkFVTFRfUkFESU89VXNlIGRlZmF1bHQKLUlucHV0RmlsZUJsb2NrX09USEVSX1JBRElPPU90aGVyCi1JbnB1dEZpbGVCbG9ja19ESUFMT0dfTUVTU0FHRT1TZWxlY3QgYW4gZXh0ZXJuYWwgaW5wdXQgZmlsZQotSW5wdXRGaWxlQmxvY2tfV09SS1NQQUNFX0RJQUxPR19NRVNTQUdFPVNlbGVjdCBhbiBpbnB1dCBmaWxlIGZyb20gdGhlIHdvcmtzcGFjZQotSW5wdXRGaWxlQmxvY2tfVkFSSUFCTEVTX0JVVFRPTj1WYXJpYWJsZXMuLi4KLUlucHV0RmlsZUJsb2NrX0ZJTEVfU1lTVEVNX0JVVFRPTj1GaWxlIFN5c3RlbS4uLgotSW5wdXRGaWxlQmxvY2tfV09SS1NQQUNFX0JVVFRPTj1Xb3Jrc3BhY2UuLi4KLUlucHV0RmlsZUJsb2NrX05hbWU9WE1MIElucHV0IEZpbGUKLUlucHV0RmlsZUJsb2NrX0V4Y2VwdGlvbl9vY2N1cnJlZF9yZWFkaW5nX2NvbmZpZ3VyYXRpb249RXhjZXB0aW9uIG9jY3VycmVkIHJlYWRpbmcgY29uZmlndXJhdGlvbgotSW5wdXRGaWxlQmxvY2tfRXhjZXB0aW9uX29jY3VycmVkX3NhdmluZ19jb25maWd1cmF0aW9uPUV4Y2VwdGlvbiBvY2N1cnJlZCBzYXZpbmcgbGF1bmNoIGNvbmZpZ3VyYXRpb24KLUlucHV0RmlsZUJsb2NrX1dPUktTUEFDRV9ESUFMT0dfVElUTEU9RmlsZSBTZWxlY3Rpb24KLQotT3V0cHV0VHlwZUJsb2NrX0dyb3VwX05hbWU9T3V0cHV0IFR5cGUKLU91dHB1dEZpbGVCbG9ja19ESVJFQ1RPUllfTk9UX1NQRUNJRklFRD1UcmFuc2Zvcm0gb3V0cHV0IGZpbGUgbm90IHNwZWNpZmllZAotT3V0cHV0RmlsZUJsb2NrX0RJUkVDVE9SWV9ET0VTX05PVF9FWElTVD1UcmFuc2Zvcm0gb3V0cHV0IGZpbGUgZG9lcyBub3QgZXhpc3QKLU91dHB1dEZpbGVCbG9ja19HUk9VUF9OQU1FPVRyYW5zZm9ybSBPdXRwdXQgRmlsZQotT3V0cHV0RmlsZUJsb2NrX0RFRkFVTFRfUkFESU89RGVmYXVsdAotT3V0cHV0RmlsZUJsb2NrX09USEVSX1JBRElPPU90aGVyCi1PdXRwdXRGaWxlQmxvY2tfRElBTE9HX01FU1NBR0U9U2VsZWN0IGFuIGV4dGVybmFsIG91dHB1dCBmaWxlCi1PdXRwdXRGaWxlQmxvY2tfV09SS1NQQUNFX0RJQUxPR19NRVNTQUdFPVNlbGVjdCBhbiBvdXRwdXQgZmlsZSBmcm9tIHRoZSB3b3Jrc3BhY2UKLU91dHB1dEZpbGVCbG9ja19WQVJJQUJMRVNfQlVUVE9OPVZhcmlhYmxlcy4uLgotT3V0cHV0RmlsZUJsb2NrX0ZJTEVfU1lTVEVNX0JVVFRPTj1GaWxlIFN5c3RlbS4uLgotT3V0cHV0RmlsZUJsb2NrX1dPUktTUEFDRV9CVVRUT049V29ya3NwYWNlLi4uCi1PdXRwdXRGaWxlQmxvY2tfTmFtZT1UcmFuc2Zvcm0gT3V0cHV0IEZpbGUKLU91dHB1dEZpbGVCbG9ja19FeGNlcHRpb25fb2NjdXJyZWRfcmVhZGluZ19jb25maWd1cmF0aW9uPUV4Y2VwdGlvbiBvY2N1cnJlZCByZWFkaW5nIGNvbmZpZ3VyYXRpb24KLU91dHB1dEZpbGVCbG9ja19FeGNlcHRpb25fb2NjdXJyZWRfc2F2aW5nX2NvbmZpZ3VyYXRpb249RXhjZXB0aW9uIG9jY3VycmVkIHNhdmluZyBsYXVuY2ggY29uZmlndXJhdGlvbgotT3V0cHV0RmlsZUJsb2NrX1dPUktTUEFDRV9ESUFMT0dfVElUTEU9RmlsZSBTZWxlY3Rpb24KLQotT3V0cHV0Rk9GaWxlQmxvY2tfRElSRUNUT1JZX05PVF9TUEVDSUZJRUQ9UmVuZGVyZXIgb3V0cHV0IGZpbGUgbm90IHNwZWNpZmllZAotT3V0cHV0Rk9GaWxlQmxvY2tfRElSRUNUT1JZX0RPRVNfTk9UX0VYSVNUPVJlbmRlcmVyIG91dHB1dCBmaWxlIGRvZXMgbm90IGV4aXN0Ci1PdXRwdXRGT0ZpbGVCbG9ja19HUk9VUF9OQU1FPVJlbmRlcmVyIE91dHB1dCBGaWxlCi1PdXRwdXRGT0ZpbGVCbG9ja19ERUZBVUxUX1JBRElPPURlZmF1bHQKLU91dHB1dEZPRmlsZUJsb2NrX09USEVSX1JBRElPPU90aGVyCi1PdXRwdXRGT0ZpbGVCbG9ja19ESUFMT0dfTUVTU0FHRT1TZWxlY3QgYW4gZXh0ZXJuYWwgb3V0cHV0IGZpbGUKLU91dHB1dEZPRmlsZUJsb2NrX1dPUktTUEFDRV9ESUFMT0dfTUVTU0FHRT1TZWxlY3QgYW4gb3V0cHV0IGZpbGUgZnJvbSB0aGUgd29ya3NwYWNlCi1PdXRwdXRGT0ZpbGVCbG9ja19WQVJJQUJMRVNfQlVUVE9OPVZhcmlhYmxlcy4uLgotT3V0cHV0Rk9GaWxlQmxvY2tfRklMRV9TWVNURU1fQlVUVE9OPUZpbGUgU3lzdGVtLi4uCi1PdXRwdXRGT0ZpbGVCbG9ja19XT1JLU1BBQ0VfQlVUVE9OPVdvcmtzcGFjZS4uLgotT3V0cHV0Rk9GaWxlQmxvY2tfTmFtZT1SZW5kZXJlciBPdXRwdXQgRmlsZQotT3V0cHV0Rk9GaWxlQmxvY2tfRXhjZXB0aW9uX29jY3VycmVkX3JlYWRpbmdfY29uZmlndXJhdGlvbj1FeGNlcHRpb24gb2NjdXJyZWQgcmVhZGluZyBjb25maWd1cmF0aW9uCi1PdXRwdXRGT0ZpbGVCbG9ja19FeGNlcHRpb25fb2NjdXJyZWRfc2F2aW5nX2NvbmZpZ3VyYXRpb249RXhjZXB0aW9uIG9jY3VycmVkIHNhdmluZyBsYXVuY2ggY29uZmlndXJhdGlvbgotT3V0cHV0Rk9GaWxlQmxvY2tfV09SS1NQQUNFX0RJQUxPR19USVRMRT1GaWxlIFNlbGVjdGlvbgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9tYWluL1BhcmFtZXRlclZpZXdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvbWFpbi9QYXJhbWV0ZXJWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJhOTRkYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9tYWluL1BhcmFtZXRlclZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5tYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5hY3Rpb25zLkFic3RyYWN0U3R5bGVzaGVldEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5jb25maWcuTGF1bmNoQXR0cmlidXRlOwotCi1wdWJsaWMgY2xhc3MgUGFyYW1ldGVyVmlld2VyIGV4dGVuZHMgVGFibGVWaWV3ZXIKLXsKLQlwcml2YXRlIGZpbmFsIExpc3RlbmVyTGlzdCBmTGlzdGVuZXJzID0gbmV3IExpc3RlbmVyTGlzdCgpOwotCi0JcHVibGljIFBhcmFtZXRlclZpZXdlcihUYWJsZSB0YWJsZSkKLQl7Ci0JCXN1cGVyKHRhYmxlKTsKLQotCQl0YWJsZS5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBldmVudCkKLQkJCXsKLQkJCQkvLyBUT0RPIC0gcmVtb3ZhbAotCQkJCS8vIGlmICh1cGRhdGVTZWxlY3Rpb24oQWJzdHJhY3RTdHlsZXNoZWV0QWN0aW9uLlJFTU9WRSwKLQkJCQkvLyAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pZ2V0U2VsZWN0aW9uKCkpICYmIGV2ZW50LmNoYXJhY3RlciA9PQotCQkJCS8vIFNXVC5ERUwgJiYgZXZlbnQuc3RhdGVNYXNrID09IDApCi0JCQkJLy8gewotCQkJCS8vIExpc3Qgc2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uRnJvbVdpZGdldCgpOwotCQkJCS8vIGdldFN0eWxlc2hlZXRDb250ZW50UHJvdmlkZXIoKS5yZW1vdmVFbnRyaWVzKChJU3R5bGVzaGVldEVudHJ5W10pc2VsZWN0aW9uLnRvQXJyYXkobmV3Ci0JCQkJLy8gSVN0eWxlc2hlZXRFbnRyeVswXSkpOwotCQkJCS8vIG5vdGlmeUNoYW5nZWQoKTsKLQkJCQkvLyB9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgUGFyYW1ldGVyc0NvbnRlbnRQcm92aWRlciBnZXRQYXJhbWV0ZXJzQ29udGVudFByb3ZpZGVyKCkKLQl7Ci0JCXJldHVybiAoUGFyYW1ldGVyc0NvbnRlbnRQcm92aWRlcikgc3VwZXIuZ2V0Q29udGVudFByb3ZpZGVyKCk7Ci0JfQotCi0JcHVibGljIFNoZWxsIGdldFNoZWxsKCkKLQl7Ci0JCXJldHVybiBnZXRDb250cm9sKCkuZ2V0U2hlbGwoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKQotCXsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKGludCBhY3Rpb25UeXBlLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pCi0JewotCQlzd2l0Y2ggKGFjdGlvblR5cGUpCi0JCXsKLQkJCWNhc2UgQWJzdHJhY3RTdHlsZXNoZWV0QWN0aW9uLkFERDoKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWNhc2UgQWJzdHJhY3RTdHlsZXNoZWV0QWN0aW9uLlJFTU9WRToKLQkJCWNhc2UgQWJzdHJhY3RTdHlsZXNoZWV0QWN0aW9uLk1PVkU6Ci0JCQlkZWZhdWx0OgotCQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiBzZWxlY3Rpb24uc2l6ZSgpID4gMDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZ2V0U2VsZWN0ZWRFbnRyaWVzKCkKLQl7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCk7Ci0JCXJldHVybiBzZWxlY3Rpb247Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUGFyYW1ldGVyKExhdW5jaEF0dHJpYnV0ZSBwYXJhbWV0ZXIpCi0JewotCQlnZXRQYXJhbWV0ZXJzQ29udGVudFByb3ZpZGVyKCkuYWRkUGFyYW1ldGVyKHBhcmFtZXRlcik7Ci0JCW5vdGlmeUNoYW5nZWQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVFbnRyaWVzKExhdW5jaEF0dHJpYnV0ZVtdIGVudHJpZXMpCi0JewotCQlnZXRQYXJhbWV0ZXJzQ29udGVudFByb3ZpZGVyKCkucmVtb3ZlUGFyYW1ldGVycyhlbnRyaWVzKTsKLQkJbm90aWZ5Q2hhbmdlZCgpOwotCX0KLQotCXB1YmxpYyBMYXVuY2hBdHRyaWJ1dGVbXSBnZXRQYXJhbWV0ZXJzKCkKLQl7Ci0JCXJldHVybiBnZXRQYXJhbWV0ZXJzQ29udGVudFByb3ZpZGVyKCkuZ2V0UGFyYW1ldGVycygpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFBhcmFtZXRlcnNDaGFuZ2VkTGlzdGVuZXIoSVBhcmFtZXRlcnNDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpCi0JewotCQlmTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlUGFyYW1ldGVyc0NoYW5nZWRMaXN0ZW5lcihJUGFyYW1ldGVyc0NoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikKLQl7Ci0JCWZMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbm90aWZ5Q2hhbmdlZCgpCi0JewotCQlPYmplY3RbXSBsaXN0ZW5lcnMgPSBmTGlzdGVuZXJzLmdldExpc3RlbmVycygpOwotCQlmb3IgKE9iamVjdCBlbGVtZW50IDogbGlzdGVuZXJzKQotCQl7Ci0JCQkoKElQYXJhbWV0ZXJzQ2hhbmdlZExpc3RlbmVyKSBlbGVtZW50KS5wYXJhbWV0ZXJzQ2hhbmdlZCh0aGlzKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvbWFpbi9QYXJhbWV0ZXJzQmxvY2suamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL21haW4vUGFyYW1ldGVyc0Jsb2NrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MGZlYzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvbWFpbi9QYXJhbWV0ZXJzQmxvY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMubWFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbWJvQm94Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLkFic3RyYWN0VGFibGVCbG9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLlhTTERlYnVnVUlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5YU0xEZWJ1Z1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuYWN0aW9ucy5BYnN0cmFjdFBhcmFtZXRlckFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLmFjdGlvbnMuQWRkUGFyYW1ldGVyQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuYWN0aW9ucy5SZW1vdmVQYXJhbWV0ZXJBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuY29uZmlnLkxhdW5jaEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5jb25maWcuTGF1bmNoVHJhbnNmb3JtOwotCi1wdWJsaWMgY2xhc3MgUGFyYW1ldGVyc0Jsb2NrIGV4dGVuZHMgQWJzdHJhY3RUYWJsZUJsb2NrCi17Ci0JcHJpdmF0ZSBQYXJhbWV0ZXJWaWV3ZXIgcGFyYW1ldGVyc1ZpZXdlcjsKLQlwcml2YXRlIEJ1dHRvbiBhZGRQYXJhbWV0ZXJCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gcmVtb3ZlUGFyYW1ldGVyQnV0dG9uOwotCXByaXZhdGUgZmluYWwgVHJhbnNmb3Jtc0Jsb2NrIHRyYW5zZm9ybXNCbG9jazsKLQlwcml2YXRlIGZpbmFsIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpCi0JewotCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLQkJewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3R5bGVzaGVldFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoc3R5bGVzaGVldFNlbGVjdGlvbi5zaXplKCkgPT0gMSkKLQkJCQlzZXRUcmFuc2Zvcm0oKExhdW5jaFRyYW5zZm9ybSkgc3R5bGVzaGVldFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0JCQllbHNlCi0JCQkJc2V0VHJhbnNmb3JtKG51bGwpOwotCQkJdXBkYXRlRW5hYmxlZCgpOwotCQl9Ci0JfTsKLQlwcml2YXRlIFRhYmxlIGZUYWJsZTsKLQotCXB1YmxpYyBQYXJhbWV0ZXJzQmxvY2soVHJhbnNmb3Jtc0Jsb2NrIHRyYW5zZm9ybXNCbG9jaykKLQl7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMudHJhbnNmb3Jtc0Jsb2NrID0gdHJhbnNmb3Jtc0Jsb2NrOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFRyYW5zZm9ybShMYXVuY2hUcmFuc2Zvcm0gdHJhbnNmb3JtKQotCXsKLQkJcGFyYW1ldGVyc1ZpZXdlci5zZXRJbnB1dCh0cmFuc2Zvcm0pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUVuYWJsZWQoKQotCXsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3R5bGVzaGVldFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdHJhbnNmb3Jtc0Jsb2NrLmdldFN0eWxlc2hlZXRWaWV3ZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJYm9vbGVhbiBlbmFibGVkID0gc3R5bGVzaGVldFNlbGVjdGlvbi5zaXplKCkgPT0gMTsKLQkJcGFyYW1ldGVyc1ZpZXdlci5nZXRUYWJsZSgpLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWFkZFBhcmFtZXRlckJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBwYXJhbWV0ZXJzU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBwYXJhbWV0ZXJzVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQlyZW1vdmVQYXJhbWV0ZXJCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkICYmICFwYXJhbWV0ZXJzU2VsZWN0aW9uLmlzRW1wdHkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KQotCXsKLQkJRm9udCBmb250ID0gcGFyZW50LmdldEZvbnQoKTsKLQotCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OT05FKTsKLQkJZ3JvdXAuc2V0VGV4dChnZXROYW1lKCkpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotCQlncm91cC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWdyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlncm91cC5zZXRGb250KGZvbnQpOwotCi0JCXNldENvbnRyb2woZ3JvdXApOwotCi0JCWZUYWJsZSA9IG5ldyBUYWJsZShncm91cCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0KLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotCQkvLyBkYXRhLmhlaWdodEhpbnQgPSAxMDA7Ci0JCWZUYWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlmVGFibGUuc2V0Rm9udChmb250KTsKLQotCQlmVGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJZlRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQotCQlUYWJsZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRhYmxlQ29sdW1uKGZUYWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4xLnNldFdpZHRoKDE1MCk7Ci0JCWNvbHVtbjEuc2V0UmVzaXphYmxlKHRydWUpOwotCQljb2x1bW4xLnNldFRleHQoIk5hbWUiKTsKLQkJY29sdW1uMS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLQkJCXsKLQkJCQkvLyBzb3J0QnlOYW1lKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCVRhYmxlQ29sdW1uIGNvbHVtbjIgPSBuZXcgVGFibGVDb2x1bW4oZlRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbjIuc2V0V2lkdGgoNTApOwotCQljb2x1bW4yLnNldFJlc2l6YWJsZSh0cnVlKTsKLQkJY29sdW1uMi5zZXRUZXh0KCJUeXBlIik7Ci0JCWNvbHVtbjIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0JCQl7Ci0JCQkJLy8gc29ydEJ5VHlwZSgpOwotCQkJfQotCQl9KTsKLQotCQlUYWJsZUNvbHVtbiBjb2x1bW4zID0gbmV3IFRhYmxlQ29sdW1uKGZUYWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4zLnNldFdpZHRoKDE1MCk7Ci0JCWNvbHVtbjMuc2V0UmVzaXphYmxlKHRydWUpOwotCQljb2x1bW4zLnNldFRleHQoIlZhbHVlIik7Ci0JCWNvbHVtbjMuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0JCQl7Ci0JCQkJLy8gc29ydEJ5VHlwZSgpOwotCQkJfQotCQl9KTsKLQotCQlwYXJhbWV0ZXJzVmlld2VyID0gbmV3IFBhcmFtZXRlclZpZXdlcihmVGFibGUpOwotCQlwYXJhbWV0ZXJzVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IFBhcmFtZXRlcnNMYWJlbFByb3ZpZGVyKCkpOwotCQlwYXJhbWV0ZXJzVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgUGFyYW1ldGVyc0NvbnRlbnRQcm92aWRlcigpKTsKLQkJcGFyYW1ldGVyc1ZpZXdlci5hZGRQYXJhbWV0ZXJzQ2hhbmdlZExpc3RlbmVyKG5ldyBJUGFyYW1ldGVyc0NoYW5nZWRMaXN0ZW5lcigpCi0JCXsKLQotCQkJcHVibGljIHZvaWQgcGFyYW1ldGVyc0NoYW5nZWQoUGFyYW1ldGVyVmlld2VyIHZpZXdlcikKLQkJCXsKLQkJCQl1cGRhdGVMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXBhcmFtZXRlcnNWaWV3ZXIuc2V0Q29sdW1uUHJvcGVydGllcyhuZXcgU3RyaW5nW10KLQkJeyAibmFtZSIsICJ0eXBlIiwgInZhbHVlIiB9KTsKLQkJZmluYWwgU3RyaW5nW10gdHlwZXMgPSBuZXcgU3RyaW5nW10KLQkJeyBMYXVuY2hBdHRyaWJ1dGUuVFlQRV9TVFJJTkcsIExhdW5jaEF0dHJpYnV0ZS5UWVBFX0JPT0xFQU4sIExhdW5jaEF0dHJpYnV0ZS5UWVBFX0lOVCwgTGF1bmNoQXR0cmlidXRlLlRZUEVfRE9VQkxFLCBMYXVuY2hBdHRyaWJ1dGUuVFlQRV9GTE9BVCwgTGF1bmNoQXR0cmlidXRlLlRZUEVfT0JKRUNULAotCQkJCUxhdW5jaEF0dHJpYnV0ZS5UWVBFX0NMQVNTLCB9OwotCQlDb21ib0JveENlbGxFZGl0b3IgY29tYm9FZGl0b3IgPSBuZXcgQ29tYm9Cb3hDZWxsRWRpdG9yKGZUYWJsZSwgdHlwZXMsIFNXVC5SRUFEX09OTFkgfCBTV1QuRFJPUF9ET1dOKTsKLQkJVGV4dENlbGxFZGl0b3IgdGV4dEVkaXRvciA9IG5ldyBUZXh0Q2VsbEVkaXRvcihmVGFibGUpOwotCQlDZWxsRWRpdG9yW10gZWRpdG9ycyA9IG5ldyBDZWxsRWRpdG9yW10KLQkJeyBudWxsLCBjb21ib0VkaXRvciwgdGV4dEVkaXRvciB9OwotCQlwYXJhbWV0ZXJzVmlld2VyLnNldENlbGxFZGl0b3JzKGVkaXRvcnMpOwotCQlwYXJhbWV0ZXJzVmlld2VyLnNldENlbGxNb2RpZmllcihuZXcgSUNlbGxNb2RpZmllcigpCi0JCXsKLQkJCXB1YmxpYyBib29sZWFuIGNhbk1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KQotCQkJewotCQkJCXJldHVybiAidHlwZSIuZXF1YWxzKHByb3BlcnR5KSB8fCAidmFsdWUiLmVxdWFscyhwcm9wZXJ0eSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkKLQkJCXsKLQkJCQlMYXVuY2hBdHRyaWJ1dGUgYXR0ID0gKExhdW5jaEF0dHJpYnV0ZSkgZWxlbWVudDsKLQkJCQlpZiAoInR5cGUiLmVxdWFscyhwcm9wZXJ0eSkpCi0JCQkJewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKQotCQkJCQl7Ci0JCQkJCQlTdHJpbmcgdHlwZSA9IHR5cGVzW2ldOwotCQkJCQkJaWYgKHR5cGUuZXF1YWxzKGF0dC50eXBlKSkKLQkJCQkJCQlyZXR1cm4gbmV3IEludGVnZXIoaSk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiBhdHQudmFsdWUgPT0gbnVsbCA/ICIiIDogYXR0LnZhbHVlOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBtb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IHZhbHVlKQotCQkJewotCQkJCUl0ZW0gaXRlbSA9IChJdGVtKSBlbGVtZW50OwotCQkJCUxhdW5jaEF0dHJpYnV0ZSBhdHQgPSAoTGF1bmNoQXR0cmlidXRlKSBpdGVtLmdldERhdGEoKTsKLQkJCQlpZiAoInR5cGUiLmVxdWFscyhwcm9wZXJ0eSkpCi0JCQkJewotCQkJCQlJbnRlZ2VyIHYgPSAoSW50ZWdlcikgdmFsdWU7Ci0JCQkJCWF0dC50eXBlID0gdHlwZXNbdi5pbnRWYWx1ZSgpXTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoInZhbHVlIi5lcXVhbHMocHJvcGVydHkpKQotCQkJCQlhdHQudmFsdWUgPSAoU3RyaW5nKSB2YWx1ZTsKLQkJCQlwYXJhbWV0ZXJzVmlld2VyLnVwZGF0ZShhdHQsIG51bGwpOwotCQkJCXVwZGF0ZUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coKTsKLQkJCX0KLQkJfSk7Ci0KLQkJQ29tcG9zaXRlIHBhcmFtZXRlckJ1dHRvbkNvbXAgPSBuZXcgQ29tcG9zaXRlKGdyb3VwLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgcGFyYW1ldGVyQnV0dG9uQ29tcExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCXBhcmFtZXRlckJ1dHRvbkNvbXBMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJcGFyYW1ldGVyQnV0dG9uQ29tcExheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCXBhcmFtZXRlckJ1dHRvbkNvbXAuc2V0TGF5b3V0KHBhcmFtZXRlckJ1dHRvbkNvbXBMYXlvdXQpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXBhcmFtZXRlckJ1dHRvbkNvbXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXBhcmFtZXRlckJ1dHRvbkNvbXAuc2V0Rm9udChmb250KTsKLQotCQlhZGRQYXJhbWV0ZXJCdXR0b24gPSBjcmVhdGVCdXR0b24ocGFyYW1ldGVyQnV0dG9uQ29tcCwgbmV3IEFkZFBhcmFtZXRlckFjdGlvbihwYXJhbWV0ZXJzVmlld2VyKSk7Ci0JCXJlbW92ZVBhcmFtZXRlckJ1dHRvbiA9IGNyZWF0ZUJ1dHRvbihwYXJhbWV0ZXJCdXR0b25Db21wLCBuZXcgUmVtb3ZlUGFyYW1ldGVyQWN0aW9uKHBhcmFtZXRlcnNWaWV3ZXIpKTsKLQotCQl0cmFuc2Zvcm1zQmxvY2suZ2V0U3R5bGVzaGVldFZpZXdlcigpLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0KLQkJcmVzdG9yZUNvbHVtblNldHRpbmdzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEJ1dHRvbiBjcmVhdGVCdXR0b24oQ29tcG9zaXRlIHBhdGhCdXR0b25Db21wLCBBYnN0cmFjdFBhcmFtZXRlckFjdGlvbiBhY3Rpb24pCi0JewotCQlCdXR0b24gYnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihwYXRoQnV0dG9uQ29tcCwgYWN0aW9uLmdldFRleHQoKSwgbnVsbCk7Ci0JCWFjdGlvbi5zZXRCdXR0b24oYnV0dG9uKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTb3J0Q29sdW1uKGludCBjb2x1bW4pCi0JewotCQlzd2l0Y2ggKGNvbHVtbikKLQkJewotCQkvLyBjYXNlIDE6Ci0JCS8vIHNvcnRCeU5hbWUoKTsKLQkJLy8gYnJlYWs7Ci0JCS8vIGNhc2UgMjoKLQkJLy8gc29ydEJ5VHlwZSgpOwotCQkvLyBicmVhazsKLQkJfQotCQlzdXBlci5zZXRTb3J0Q29sdW1uKGNvbHVtbik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFRhYmxlIGdldFRhYmxlKCkKLQl7Ci0JCXJldHVybiBmVGFibGU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElEaWFsb2dTZXR0aW5ncyBnZXREaWFsb2dTZXR0aW5ncygpCi0JewotCQlyZXR1cm4gWFNMRGVidWdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFF1YWxpZmllcigpCi0JewotCQlyZXR1cm4gWFNMRGVidWdVSUNvbnN0YW50cy5NQUlOX1BBUkFNQVRFUlNfQkxPQ0s7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JCXJldHVybiAiVHJhbnNmb3JtYXRpb24gUGFyYW1ldGVycyI7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikKLQl7Ci0JCS8vIGhhbmRsZWQgYnkgdGhlIFRhYgotCQl1cGRhdGVFbmFibGVkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybUFwcGx5KElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlndXJhdGlvbikKLQl7Ci0JCS8vIGhhbmRsZWQgYnkgdGhlIFRhYgotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRzKElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlndXJhdGlvbikKLQl7Ci0JCS8vIGhhbmRsZWQgYnkgdGhlIFRhYgotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotCXsKLQkJaWYgKHRyYW5zZm9ybXNCbG9jay5nZXRTdHlsZXNoZWV0Vmlld2VyKCkgIT0gbnVsbCkKLQkJCXRyYW5zZm9ybXNCbG9jay5nZXRTdHlsZXNoZWV0Vmlld2VyKCkucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL21haW4vUGFyYW1ldGVyc0NvbnRlbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvbWFpbi9QYXJhbWV0ZXJzQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkYzhlZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvbWFpbi9QYXJhbWV0ZXJzQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMubWFpbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuY29uZmlnLkxhdW5jaEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5jb25maWcuTGF1bmNoVHJhbnNmb3JtOwotCi1wdWJsaWMgY2xhc3MgUGFyYW1ldGVyc0NvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyCi17Ci0JcHJpdmF0ZSBMYXVuY2hUcmFuc2Zvcm0gc3R5bGVzaGVldEVudHJ5OwotCXByaXZhdGUgUGFyYW1ldGVyVmlld2VyIHBhcmFtZXRlclZpZXdlcjsKLQotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KQotCXsKLQkJaWYgKHN0eWxlc2hlZXRFbnRyeSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JCXJldHVybiBzdHlsZXNoZWV0RW50cnkuZ2V0UGFyYW1ldGVycygpLnRvQXJyYXkoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpCi0JewotCQlzdHlsZXNoZWV0RW50cnkgPSAoTGF1bmNoVHJhbnNmb3JtKSBuZXdJbnB1dDsKLQkJcGFyYW1ldGVyVmlld2VyID0gKFBhcmFtZXRlclZpZXdlcikgdmlld2VyOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotCXsKLQl9Ci0KLQlwdWJsaWMgTGF1bmNoQXR0cmlidXRlW10gZ2V0UGFyYW1ldGVycygpCi0JewotCQlyZXR1cm4gKExhdW5jaEF0dHJpYnV0ZVtdKSBzdHlsZXNoZWV0RW50cnkuZ2V0UGFyYW1ldGVycygpLnRvQXJyYXkobmV3IExhdW5jaEF0dHJpYnV0ZVswXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlUGFyYW1ldGVycyhMYXVuY2hBdHRyaWJ1dGVbXSBlbnRyaWVzKQotCXsKLQkJZm9yIChMYXVuY2hBdHRyaWJ1dGUgcGFyYW1ldGVyIDogZW50cmllcykKLQkJewotCQkJc3R5bGVzaGVldEVudHJ5LmdldFBhcmFtZXRlcnMoKS5yZW1vdmUocGFyYW1ldGVyKTsKLQkJfQotCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IHBhcmFtZXRlclZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1zKCk7Ci0JCUxpc3Q8TGF1bmNoQXR0cmlidXRlPiBlbnRyeUxpc3QgPSBBcnJheXMuYXNMaXN0KGVudHJpZXMpOwotCQlPYmplY3Qgc2VsID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IGl0ZW1zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKQotCQl7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IGl0ZW1zW2ldOwotCQkJaWYgKCFlbnRyeUxpc3QuY29udGFpbnMoaXRlbS5nZXREYXRhKCkpKQotCQkJewotCQkJCXNlbCA9IGl0ZW0uZ2V0RGF0YSgpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXBhcmFtZXRlclZpZXdlci5yZW1vdmUoZW50cmllcyk7Ci0KLQkJaWYgKHNlbCAhPSBudWxsKQotCQkJcGFyYW1ldGVyVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWwpLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQYXJhbWV0ZXIoTGF1bmNoQXR0cmlidXRlIHBhcmFtZXRlcikKLQl7Ci0JCXN0eWxlc2hlZXRFbnRyeS5nZXRQYXJhbWV0ZXJzKCkuYWRkKHBhcmFtZXRlcik7Ci0JCXBhcmFtZXRlclZpZXdlci5hZGQocGFyYW1ldGVyKTsKLQkJcGFyYW1ldGVyVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihwYXJhbWV0ZXIpLCB0cnVlKTsKLQkJLy8gcGFyYW1ldGVyVmlld2VyLnJlZnJlc2goKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9tYWluL1BhcmFtZXRlcnNMYWJlbFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9tYWluL1BhcmFtZXRlcnNMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMjYwNTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvbWFpbi9QYXJhbWV0ZXJzTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLm1haW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5jb25maWcuTGF1bmNoQXR0cmlidXRlOwotCi1wdWJsaWMgY2xhc3MgUGFyYW1ldGVyc0xhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyCi17Ci0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpCi0JewotCQlMYXVuY2hBdHRyaWJ1dGUgcCA9IChMYXVuY2hBdHRyaWJ1dGUpIGVsZW1lbnQ7Ci0JCXN3aXRjaCAoY29sdW1uSW5kZXgpCi0JCXsKLQkJCWNhc2UgMDoKLQkJCQlyZXR1cm4gcC51cmk7Ci0JCQljYXNlIDE6Ci0JCQkJcmV0dXJuIHAudHlwZTsKLQkJCWNhc2UgMjoKLQkJCQlyZXR1cm4gcC52YWx1ZTsKLQkJfQotCQlyZXR1cm4gIiEiOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KQotCXsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikKLQl7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpCi0JewotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KQotCXsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpCi0JewotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL21haW4vU3R5bGVzaGVldENvbnRlbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvbWFpbi9TdHlsZXNoZWV0Q29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3YzM0YWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvbWFpbi9TdHlsZXNoZWV0Q29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMubWFpbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuY29uZmlnLkxhdW5jaFBpcGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmNvbmZpZy5MYXVuY2hUcmFuc2Zvcm07Ci0KLXB1YmxpYyBjbGFzcyBTdHlsZXNoZWV0Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIKLXsKLQlwcml2YXRlIFRhYmxlVmlld2VyIHRhYmxlVmlld2VyOwotCXByaXZhdGUgTGF1bmNoUGlwZWxpbmUgcGlwZWxpbmU7Ci0KLQlwdWJsaWMgU3R5bGVzaGVldENvbnRlbnRQcm92aWRlcigpCi0JewotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KQotCXsKLQkJcmV0dXJuIHBpcGVsaW5lLmdldFRyYW5zZm9ybURlZnMoKS50b0FycmF5KG5ldyBMYXVuY2hUcmFuc2Zvcm1bMF0pOwotCX0KLQotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkKLQl7Ci0JCXRhYmxlVmlld2VyID0gKFRhYmxlVmlld2VyKSB2aWV3ZXI7Ci0JCXBpcGVsaW5lID0gKExhdW5jaFBpcGVsaW5lKSBuZXdJbnB1dDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLQl7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RW50cmllcyhMYXVuY2hUcmFuc2Zvcm1bXSB0cmFuc2Zvcm1zKQotCXsKLQkJcGlwZWxpbmUuc2V0VHJhbnNmb3JtRGVmcyhuZXcgQXJyYXlMaXN0PExhdW5jaFRyYW5zZm9ybT4oQXJyYXlzLmFzTGlzdCh0cmFuc2Zvcm1zKSkpOwotCQl0YWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRW50cmllcyhMYXVuY2hUcmFuc2Zvcm1bXSByZXMsIE9iamVjdCBiZWZvcmVFbGVtZW50KQotCXsKLQkJZm9yIChMYXVuY2hUcmFuc2Zvcm0gdHJhbnNmb3JtIDogcmVzKQotCQl7Ci0JCQlwaXBlbGluZS5hZGRUcmFuc2Zvcm1EZWYodHJhbnNmb3JtKTsKLQkJfQotCQl0YWJsZVZpZXdlci5hZGQocmVzKTsKLQkJLy8gc2VsZWN0IHRoZSBmaXJzdCBuZXcgb25lCi0JCXRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihyZXNbMF0pLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVFbnRyaWVzKExhdW5jaFRyYW5zZm9ybVtdIHJlcykKLQl7Ci0JCWZvciAoTGF1bmNoVHJhbnNmb3JtIHRyYW5zZm9ybSA6IHJlcykKLQkJewotCQkJcGlwZWxpbmUucmVtb3ZlVHJhbnNmb3JtRGVmKHRyYW5zZm9ybSk7Ci0JCX0KLQkJdGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvbWFpbi9TdHlsZXNoZWV0TGFiZWxQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvbWFpbi9TdHlsZXNoZWV0TGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjQxNDFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL21haW4vU3R5bGVzaGVldExhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5tYWluOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuY29uZmlnLkxhdW5jaFRyYW5zZm9ybTsKLQotcHVibGljIGNsYXNzIFN0eWxlc2hlZXRMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlcgotewotCUBPdmVycmlkZQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkKLQl7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkKLQl7Ci0JCUxhdW5jaFRyYW5zZm9ybSBsdCA9IChMYXVuY2hUcmFuc2Zvcm0pIGVsZW1lbnQ7Ci0JCWludCBpbmRleCA9IGx0LmdldFBpcGVsaW5lKCkuZ2V0VHJhbnNmb3JtRGVmcygpLmluZGV4T2YobHQpOwotCi0JCUlQYXRoIHBhdGg7Ci0JCXRyeQotCQl7Ci0JCQlwYXRoID0gbHQuZ2V0UGF0aCgpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0JCXsKLQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChNYWluVGFiTWVzc2FnZXMuU3R5bGVzaGVldEVudHJ5TGFiZWxQcm92aWRlcl9JbnZhbGlkX3BhdGgsIG5ldyBTdHJpbmdbXQotCQkJeyAibnVsbCIgfSk7Ci0JCX0KLQotCQlpZiAocGF0aCA9PSBudWxsKQotCQl7Ci0JCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoTWFpblRhYk1lc3NhZ2VzLlN0eWxlc2hlZXRFbnRyeUxhYmVsUHJvdmlkZXJfSW52YWxpZF9wYXRoLCBuZXcgU3RyaW5nW10KLQkJCXsgIm51bGwiIH0pOwotCQl9Ci0JCWVsc2UgaWYgKCFwYXRoLmlzQWJzb2x1dGUoKSB8fCAhcGF0aC5pc1ZhbGlkUGF0aChwYXRoLnRvU3RyaW5nKCkpKQotCQl7Ci0JCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoTWFpblRhYk1lc3NhZ2VzLlN0eWxlc2hlZXRFbnRyeUxhYmVsUHJvdmlkZXJfSW52YWxpZF9wYXRoLCBuZXcgU3RyaW5nW10KLQkJCXsgcGF0aC50b1N0cmluZygpIH0pOwotCQl9Ci0KLQkJU3RyaW5nW10gc2VnbWVudHMgPSBwYXRoLnNlZ21lbnRzKCk7Ci0JCVN0cmluZ0J1ZmZlciBkaXNwbGF5UGF0aCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKHNlZ21lbnRzLmxlbmd0aCA+IDApCi0JCXsKLQkJCWRpc3BsYXlQYXRoLmFwcGVuZChzZWdtZW50c1tzZWdtZW50cy5sZW5ndGggLSAxXSk7Ci0JCQlkaXNwbGF5UGF0aC5hcHBlbmQoIiAtICIpOwotCQkJU3RyaW5nIGRldmljZSA9IHBhdGguZ2V0RGV2aWNlKCk7Ci0JCQlpZiAoZGV2aWNlICE9IG51bGwpCi0JCQl7Ci0JCQkJZGlzcGxheVBhdGguYXBwZW5kKGRldmljZSk7Ci0JCQl9Ci0JCQlkaXNwbGF5UGF0aC5hcHBlbmQoRmlsZS5zZXBhcmF0b3IpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGggLSAxOyBpKyspCi0JCQl7Ci0JCQkJZGlzcGxheVBhdGguYXBwZW5kKHNlZ21lbnRzW2ldKS5hcHBlbmQoRmlsZS5zZXBhcmF0b3IpOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJewotCQkJZGlzcGxheVBhdGguYXBwZW5kKHBhdGgudG9TdHJpbmcoKSk7Ci0JCX0KLQkJcmV0dXJuIChpbmRleCArIDEpICsgIikgIiArIGRpc3BsYXlQYXRoLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvbWFpbi9TdHlsZXNoZWV0Vmlld2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9tYWluL1N0eWxlc2hlZXRWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAzMGQ2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9tYWluL1N0eWxlc2hlZXRWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMubWFpbjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5hY3Rpb25zLkFic3RyYWN0U3R5bGVzaGVldEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5jb25maWcuTGF1bmNoVHJhbnNmb3JtOwotCi1wdWJsaWMgY2xhc3MgU3R5bGVzaGVldFZpZXdlciBleHRlbmRzIFRhYmxlVmlld2VyCi17Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0ZW5lckxpc3QgbGlzdGVuZXJMaXN0ID0gbmV3IExpc3RlbmVyTGlzdCgpOwotCi0JcHVibGljIFN0eWxlc2hlZXRWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkKLQl7Ci0JCXN1cGVyKHBhcmVudCk7Ci0KLQkJZ2V0VGFibGUoKS5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBldmVudCkKLQkJCXsKLQkJCQlpZiAodXBkYXRlU2VsZWN0aW9uKEFic3RyYWN0U3R5bGVzaGVldEFjdGlvbi5SRU1PVkUsIChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCkpICYmIGV2ZW50LmNoYXJhY3RlciA9PSBTV1QuREVMICYmIGV2ZW50LnN0YXRlTWFzayA9PSAwKQotCQkJCXsKLQkJCQkJTGlzdDw/PiBzZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb25Gcm9tV2lkZ2V0KCk7Ci0JCQkJCWdldFN0eWxlc2hlZXRDb250ZW50UHJvdmlkZXIoKS5yZW1vdmVFbnRyaWVzKChMYXVuY2hUcmFuc2Zvcm1bXSkgc2VsZWN0aW9uLnRvQXJyYXkobmV3IExhdW5jaFRyYW5zZm9ybVswXSkpOwotCQkJCQlub3RpZnlDaGFuZ2VkKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIFN0eWxlc2hlZXRDb250ZW50UHJvdmlkZXIgZ2V0U3R5bGVzaGVldENvbnRlbnRQcm92aWRlcigpCi0JewotCQlyZXR1cm4gKFN0eWxlc2hlZXRDb250ZW50UHJvdmlkZXIpIHN1cGVyLmdldENvbnRlbnRQcm92aWRlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVudHJpZXMoTGF1bmNoVHJhbnNmb3JtW10gdHJhbnNmb3JtcykKLQl7Ci0JCWdldFN0eWxlc2hlZXRDb250ZW50UHJvdmlkZXIoKS5zZXRFbnRyaWVzKHRyYW5zZm9ybXMpOwotCQlub3RpZnlDaGFuZ2VkKCk7Ci0JfQotCi0JcHVibGljIExhdW5jaFRyYW5zZm9ybVtdIGdldEVudHJpZXMoKQotCXsKLQkJcmV0dXJuIChMYXVuY2hUcmFuc2Zvcm1bXSkgZ2V0U3R5bGVzaGVldENvbnRlbnRQcm92aWRlcigpLmdldEVsZW1lbnRzKG51bGwpOwotCX0KLQotCXB1YmxpYyBTaGVsbCBnZXRTaGVsbCgpCi0JewotCQlyZXR1cm4gZ2V0Q29udHJvbCgpLmdldFNoZWxsKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkKLQl7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihpbnQgYWN0aW9uVHlwZSwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKQotCXsKLQkJc3dpdGNoIChhY3Rpb25UeXBlKQotCQl7Ci0JCQljYXNlIEFic3RyYWN0U3R5bGVzaGVldEFjdGlvbi5BREQ6Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQljYXNlIEFic3RyYWN0U3R5bGVzaGVldEFjdGlvbi5SRU1PVkU6Ci0JCQljYXNlIEFic3RyYWN0U3R5bGVzaGVldEFjdGlvbi5NT1ZFOgotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKLQkJfQotCQlyZXR1cm4gc2VsZWN0aW9uLnNpemUoKSA+IDA7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGdldFNlbGVjdGVkRW50cmllcygpCi0JewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFNlbGVjdGlvbigpOwotCQlyZXR1cm4gc2VsZWN0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFRyYW5zZm9ybXMoTGF1bmNoVHJhbnNmb3JtW10gcmVzKQotCXsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRTZWxlY3Rpb24oKTsKLQkJT2JqZWN0IGJlZm9yZUVsZW1lbnQgPSBzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCWlmIChnZXRFbnRyaWVzKCkubGVuZ3RoID4gMSAmJiBiZWZvcmVFbGVtZW50ID09IG51bGwpCi0JCQliZWZvcmVFbGVtZW50ID0gZ2V0RW50cmllcygpW2dldEVudHJpZXMoKS5sZW5ndGggLSAxXTsKLQkJZ2V0U3R5bGVzaGVldENvbnRlbnRQcm92aWRlcigpLmFkZEVudHJpZXMocmVzLCBiZWZvcmVFbGVtZW50KTsKLQkJbm90aWZ5Q2hhbmdlZCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUVudHJpZXMoTGF1bmNoVHJhbnNmb3JtW10gZW50cmllcykKLQl7Ci0JCWdldFN0eWxlc2hlZXRDb250ZW50UHJvdmlkZXIoKS5yZW1vdmVFbnRyaWVzKGVudHJpZXMpOwotCQlub3RpZnlDaGFuZ2VkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRW50cmllc0NoYW5nZWRMaXN0ZW5lcihJU3R5bGVzaGVldEVudHJpZXNDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpCi0JewotCQlsaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVFbnRyaWVzQ2hhbmdlZExpc3RlbmVyKElTdHlsZXNoZWV0RW50cmllc0NoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikKLQl7Ci0JCWxpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBub3RpZnlDaGFuZ2VkKCkKLQl7Ci0JCU9iamVjdFtdIGxpc3RlbmVycyA9IGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKTsKLQkJZm9yIChPYmplY3QgZWxlbWVudCA6IGxpc3RlbmVycykKLQkJewotCQkJKChJU3R5bGVzaGVldEVudHJpZXNDaGFuZ2VkTGlzdGVuZXIpIGVsZW1lbnQpLmVudHJpZXNDaGFuZ2VkKHRoaXMpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9tYWluL1RyYW5zZm9ybXNCbG9jay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvbWFpbi9UcmFuc2Zvcm1zQmxvY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVkMmRhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9tYWluL1RyYW5zZm9ybXNCbG9jay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5tYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLkFic3RyYWN0VGFibGVCbG9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLlhTTERlYnVnVUlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5YU0xEZWJ1Z1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuYWN0aW9ucy5BYnN0cmFjdFN0eWxlc2hlZXRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5hY3Rpb25zLkFkZEV4dGVybmFsRmlsZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLmFjdGlvbnMuQWRkV29ya3NwYWNlRmlsZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLmFjdGlvbnMuTW92ZURvd25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5hY3Rpb25zLk1vdmVVcEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLmFjdGlvbnMuUmVtb3ZlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmNvbmZpZy5MYXVuY2hQaXBlbGluZTsKLQotcHVibGljIGNsYXNzIFRyYW5zZm9ybXNCbG9jayBleHRlbmRzIEFic3RyYWN0VGFibGVCbG9jayBpbXBsZW1lbnRzIElTdHlsZXNoZWV0RW50cmllc0NoYW5nZWRMaXN0ZW5lcgotewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUxPR19TRVRUSU5HU19QUkVGSVggPSAiVHJhbnNmb3Jtc0Jsb2NrIjsKLQlwcml2YXRlIFN0eWxlc2hlZXRWaWV3ZXIgc3R5bGVzaGVldFZpZXdlcjsKLQlwcml2YXRlIExhdW5jaFBpcGVsaW5lIHBpcGVsaW5lOwotCi0JcHVibGljIFRyYW5zZm9ybXNCbG9jaygpCi0JewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLQl7Ci0JCUZvbnQgZm9udCA9IHBhcmVudC5nZXRGb250KCk7Ci0KLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWdyb3VwLnNldFRleHQoZ2V0TmFtZSgpKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlncm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJZ3JvdXAuc2V0Rm9udChmb250KTsKLQotCQlzZXRDb250cm9sKGdyb3VwKTsKLQotCQlzdHlsZXNoZWV0Vmlld2VyID0gbmV3IFN0eWxlc2hlZXRWaWV3ZXIoZ3JvdXApOwotCQlnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotCQlzdHlsZXNoZWV0Vmlld2VyLmdldFRhYmxlKCkuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXN0eWxlc2hlZXRWaWV3ZXIuYWRkRW50cmllc0NoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJc3R5bGVzaGVldFZpZXdlci5nZXRDb250cm9sKCkuc2V0Rm9udChmb250KTsKLQkJc3R5bGVzaGVldFZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBTdHlsZXNoZWV0TGFiZWxQcm92aWRlcigpKTsKLQkJc3R5bGVzaGVldFZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFN0eWxlc2hlZXRDb250ZW50UHJvdmlkZXIoKSk7Ci0KLQkJQ29tcG9zaXRlIHVwRG93bkJ1dHRvbkNvbXAgPSBuZXcgQ29tcG9zaXRlKGdyb3VwLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgdXBEb3duQnV0dG9uTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJdXBEb3duQnV0dG9uTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCXVwRG93bkJ1dHRvbkxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCXVwRG93bkJ1dHRvbkNvbXAuc2V0TGF5b3V0KHVwRG93bkJ1dHRvbkxheW91dCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIHRydWUpOwotCQl1cERvd25CdXR0b25Db21wLnNldExheW91dERhdGEoZ2QpOwotCQl1cERvd25CdXR0b25Db21wLnNldEZvbnQoZm9udCk7Ci0KLQkJY3JlYXRlQXJyb3dCdXR0b24odXBEb3duQnV0dG9uQ29tcCwgbmV3IE1vdmVVcEFjdGlvbihzdHlsZXNoZWV0Vmlld2VyKSwgU1dULlVQKTsKLQkJTGFiZWwgc3BhY2VyID0gbmV3IExhYmVsKHVwRG93bkJ1dHRvbkNvbXAsIFNXVC5OT05FKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoU1dULk5PTkUsIFNXVC5GSUxMLCBmYWxzZSwgdHJ1ZSk7Ci0JCXNwYWNlci5zZXRMYXlvdXREYXRhKGdkKTsKLQkJY3JlYXRlQXJyb3dCdXR0b24odXBEb3duQnV0dG9uQ29tcCwgbmV3IE1vdmVEb3duQWN0aW9uKHN0eWxlc2hlZXRWaWV3ZXIpLCBTV1QuRE9XTik7Ci0KLQkJQ29tcG9zaXRlIHBhdGhCdXR0b25Db21wID0gbmV3IENvbXBvc2l0ZShncm91cCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IHBhdGhCdXR0b25MYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlwYXRoQnV0dG9uTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCXBhdGhCdXR0b25MYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlwYXRoQnV0dG9uQ29tcC5zZXRMYXlvdXQocGF0aEJ1dHRvbkxheW91dCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCXBhdGhCdXR0b25Db21wLnNldExheW91dERhdGEoZ2QpOwotCQlwYXRoQnV0dG9uQ29tcC5zZXRGb250KGZvbnQpOwotCi0JCWNyZWF0ZUJ1dHRvbihwYXRoQnV0dG9uQ29tcCwgbmV3IEFkZFdvcmtzcGFjZUZpbGVBY3Rpb24oc3R5bGVzaGVldFZpZXdlcikpOwotCQljcmVhdGVCdXR0b24ocGF0aEJ1dHRvbkNvbXAsIG5ldyBBZGRFeHRlcm5hbEZpbGVBY3Rpb24oc3R5bGVzaGVldFZpZXdlciwgRElBTE9HX1NFVFRJTkdTX1BSRUZJWCkpOwotCQkvLyBUT0RPCi0JCS8vIGNyZWF0ZUJ1dHRvbihwYXRoQnV0dG9uQ29tcCwgbmV3Ci0JCS8vIFNldFVSSVJlc29sdmVyQWN0aW9uKHN0eWxlc2hlZXRWaWV3ZXIpKTsKLQkJY3JlYXRlQnV0dG9uKHBhdGhCdXR0b25Db21wLCBuZXcgUmVtb3ZlQWN0aW9uKHN0eWxlc2hlZXRWaWV3ZXIpKTsKLQl9Ci0KLQlwdWJsaWMgVmlld2VyIGdldFN0eWxlc2hlZXRWaWV3ZXIoKQotCXsKLQkJcmV0dXJuIHN0eWxlc2hlZXRWaWV3ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIEJ1dHRvbiBjcmVhdGVBcnJvd0J1dHRvbihDb21wb3NpdGUgcGF0aEJ1dHRvbkNvbXAsIEFic3RyYWN0U3R5bGVzaGVldEFjdGlvbiBhY3Rpb24sIGludCB1cGRvd24pCi0JewotCQlCdXR0b24gYiA9IG5ldyBCdXR0b24ocGF0aEJ1dHRvbkNvbXAsIFNXVC5BUlJPVyB8IHVwZG93bik7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWIuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWFjdGlvbi5zZXRCdXR0b24oYik7Ci0JCXJldHVybiBiOwotCX0KLQotCXByb3RlY3RlZCBCdXR0b24gY3JlYXRlQnV0dG9uKENvbXBvc2l0ZSBwYXRoQnV0dG9uQ29tcCwgQWJzdHJhY3RTdHlsZXNoZWV0QWN0aW9uIGFjdGlvbikKLQl7Ci0JCUJ1dHRvbiBidXR0b24gPSBjcmVhdGVQdXNoQnV0dG9uKHBhdGhCdXR0b25Db21wLCBhY3Rpb24uZ2V0VGV4dCgpLCBudWxsKTsKLQkJYWN0aW9uLnNldEJ1dHRvbihidXR0b24pOwotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCQlyZXR1cm4gTWFpblRhYk1lc3NhZ2VzLlRyYW5zZm9ybXNCbG9ja19OYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBpcGVsaW5lKExhdW5jaFBpcGVsaW5lIHBpcGVsaW5lKQotCXsKLQkJdGhpcy5waXBlbGluZSA9IHBpcGVsaW5lOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pCi0JewotCQlzdHlsZXNoZWV0Vmlld2VyLnNldElucHV0KHBpcGVsaW5lKTsKLQkJaWYgKHBpcGVsaW5lLmdldFRyYW5zZm9ybURlZnMoKS5zaXplKCkgPiAwKQotCQl7Ci0JCQlzdHlsZXNoZWV0Vmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihwaXBlbGluZS5nZXRUcmFuc2Zvcm1EZWZzKCkuZ2V0KDApKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtQXBwbHkoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uKQotCXsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0cyhJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24pCi0JewotCX0KLQotCXB1YmxpYyB2b2lkIGVudHJpZXNDaGFuZ2VkKFN0eWxlc2hlZXRWaWV3ZXIgdmlld2VyKQotCXsKLQkJc2V0RGlydHkodHJ1ZSk7Ci0JCXVwZGF0ZUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTb3J0Q29sdW1uKGludCBjb2x1bW4pCi0JewotCQlzd2l0Y2ggKGNvbHVtbikKLQkJewotCQkvLyBjYXNlIDE6Ci0JCS8vIHNvcnRCeU5hbWUoKTsKLQkJLy8gYnJlYWs7Ci0JCS8vIGNhc2UgMjoKLQkJLy8gc29ydEJ5VHlwZSgpOwotCQkvLyBicmVhazsKLQkJfQotCQlzdXBlci5zZXRTb3J0Q29sdW1uKGNvbHVtbik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFRhYmxlIGdldFRhYmxlKCkKLQl7Ci0JCXJldHVybiBzdHlsZXNoZWV0Vmlld2VyID09IG51bGwgPyBudWxsIDogc3R5bGVzaGVldFZpZXdlci5nZXRUYWJsZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJRGlhbG9nU2V0dGluZ3MgZ2V0RGlhbG9nU2V0dGluZ3MoKQotCXsKLQkJcmV0dXJuIFhTTERlYnVnVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRRdWFsaWZpZXIoKQotCXsKLQkJcmV0dXJuIFhTTERlYnVnVUlDb25zdGFudHMuTUFJTl9UUkFOU0ZPUk1TX0JMT0NLOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotCXsKLQkJaWYgKHN0eWxlc2hlZXRWaWV3ZXIgIT0gbnVsbCkKLQkJCXN0eWxlc2hlZXRWaWV3ZXIucmVtb3ZlRW50cmllc0NoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL21haW4vWFNMTWFpblRhYi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvbWFpbi9YU0xNYWluVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwYjQ0YzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvbWFpbi9YU0xNYWluVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLm1haW47Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuWFNMRGVidWdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLlhTTExhdW5jaENvbmZpZ3VyYXRpb25UYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5jb25maWcuTGF1bmNoUGlwZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuY29uZmlnLkxhdW5jaFRyYW5zZm9ybTsKLQotcHVibGljIGNsYXNzIFhTTE1haW5UYWIgZXh0ZW5kcyBYU0xMYXVuY2hDb25maWd1cmF0aW9uVGFiCi17Ci0JcHJpdmF0ZSBmaW5hbCBJbnB1dEZpbGVCbG9jayBpbnB1dEZpbGVCbG9jazsKLQlwcml2YXRlIGZpbmFsIFRyYW5zZm9ybXNCbG9jayB0cmFuc2Zvcm1zQmxvY2s7Ci0JcHJpdmF0ZSBmaW5hbCBQYXJhbWV0ZXJzQmxvY2sgcGFyYW1ldGVyc0Jsb2NrOwotCXB1YmxpYyBMYXVuY2hQaXBlbGluZSBwaXBlbGluZTsKLQotCS8vIHByaXZhdGUgUmVuZGVyQmxvY2sgcmVuZGVyQmxvY2s7Ci0JLy8gcHJpdmF0ZSBPdXRwdXRCbG9jayBvdXRwdXRCbG9jazsKLQotCXB1YmxpYyBYU0xNYWluVGFiKCkKLQl7Ci0JCUlSZXNvdXJjZVtdIHJlc291cmNlQ29udGV4dCA9IGdldENvbnRleHQoKTsKLQkJSUZpbGUgaW5wdXRGaWxlID0gZ2V0WE1MSW5wdXQocmVzb3VyY2VDb250ZXh0KTsKLQotCQlpbnB1dEZpbGVCbG9jayA9IG5ldyBJbnB1dEZpbGVCbG9jayhpbnB1dEZpbGUpOwotCQl0cmFuc2Zvcm1zQmxvY2sgPSBuZXcgVHJhbnNmb3Jtc0Jsb2NrKCk7Ci0JCXBhcmFtZXRlcnNCbG9jayA9IG5ldyBQYXJhbWV0ZXJzQmxvY2sodHJhbnNmb3Jtc0Jsb2NrKTsKLQkJLy8gcmVuZGVyQmxvY2sgPSBuZXcgUmVuZGVyQmxvY2soKTsKLQkJLy8gb3V0cHV0QmxvY2sgPSBuZXcgT3V0cHV0QmxvY2soKTsKLQotCQlzZXRCbG9ja3MobmV3IElMYXVuY2hDb25maWd1cmF0aW9uVGFiW10KLQkJeyBpbnB1dEZpbGVCbG9jaywgdHJhbnNmb3Jtc0Jsb2NrLCBwYXJhbWV0ZXJzQmxvY2sgfSk7IC8vICxyZW5kZXJCbG9jayxvdXRwdXRCbG9ja30pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLQl7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQkJQ29tcG9zaXRlIGNvbXAgPSAoQ29tcG9zaXRlKSBnZXRDb250cm9sKCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotCQljb21wLnNldExheW91dChsYXlvdXQpOwotCi0JCWlucHV0RmlsZUJsb2NrLmNyZWF0ZUNvbnRyb2woY29tcCk7Ci0JCXRyYW5zZm9ybXNCbG9jay5jcmVhdGVDb250cm9sKGNvbXApOwotCQlwYXJhbWV0ZXJzQmxvY2suY3JlYXRlQ29udHJvbChjb21wKTsKLQkJLy8gcmVuZGVyQmxvY2suY3JlYXRlQ29udHJvbChjb21wKTsKLQkJLy8gb3V0cHV0QmxvY2suY3JlYXRlQ29udHJvbChjb21wKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0cyhJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24pCi0JewotCQlMYXVuY2hQaXBlbGluZSBscCA9IG5ldyBMYXVuY2hQaXBlbGluZSgpOwotCQlJUmVzb3VyY2VbXSByZXNvdXJjZUNvbnRleHQgPSBnZXRDb250ZXh0KCk7Ci0JCUlGaWxlW10gc3R5bGVzaGVldHMgPSBnZXRYU0xTdHlsZXNoZWV0cyhyZXNvdXJjZUNvbnRleHQpOwotCQlmb3IgKElGaWxlIGZpbGUgOiBzdHlsZXNoZWV0cykKLQkJewotCQkJTGF1bmNoVHJhbnNmb3JtIGx0ID0gbmV3IExhdW5jaFRyYW5zZm9ybShmaWxlLmdldEZ1bGxQYXRoKCkudG9Qb3J0YWJsZVN0cmluZygpLCBMYXVuY2hUcmFuc2Zvcm0uUkVTT1VSQ0VfVFlQRSk7Ci0JCQlscC5hZGRUcmFuc2Zvcm1EZWYobHQpOwotCQl9Ci0JCXNhdmVQaXBlbGluZShjb25maWd1cmF0aW9uLCBscCk7Ci0JCXN1cGVyLnNldERlZmF1bHRzKGNvbmZpZ3VyYXRpb24pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pCi0JewotCQlwaXBlbGluZSA9IG51bGw7Ci0JCXRyeQotCQl7Ci0JCQlTdHJpbmcgcyA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QSVBFTElORSwgKFN0cmluZykgbnVsbCk7Ci0JCQlpZiAocyAhPSBudWxsICYmIHMubGVuZ3RoKCkgPiAwKQotCQkJewotCQkJCUJ5dGVBcnJheUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHMuZ2V0Qnl0ZXMoKSk7Ci0JCQkJcGlwZWxpbmUgPSBMYXVuY2hQaXBlbGluZS5mcm9tWE1MKGlucHV0U3RyZWFtKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlwaXBlbGluZSA9IG5ldyBMYXVuY2hQaXBlbGluZSgpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0JCXsKLQkJCVhTTERlYnVnVUlQbHVnaW4ubG9nKGUpOwotCQl9Ci0JCXRyYW5zZm9ybXNCbG9jay5zZXRQaXBlbGluZShwaXBlbGluZSk7Ci0JCXN1cGVyLmluaXRpYWxpemVGcm9tKGNvbmZpZ3VyYXRpb24pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHBlcmZvcm1BcHBseShJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24pCi0JewotCQlzdXBlci5wZXJmb3JtQXBwbHkoY29uZmlndXJhdGlvbik7Ci0JCXNhdmVQaXBlbGluZShjb25maWd1cmF0aW9uLCBwaXBlbGluZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNhdmVQaXBlbGluZShJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24sIExhdW5jaFBpcGVsaW5lIHBpcGVsaW5lKQotCXsKLQkJdHJ5Ci0JCXsKLQkJCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QSVBFTElORSwgcGlwZWxpbmUudG9YTUwoKSk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLQkJewotCQkJWFNMRGVidWdVSVBsdWdpbi5sb2coZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkJcmV0dXJuIE1haW5UYWJNZXNzYWdlcy5YU0xNYWluVGFiX1RhYk5hbWU7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSVJlc291cmNlW10gZ2V0Q29udGV4dCgpCi0JewotCi0JCS8vIElQcm9qZWN0W10gcHJvamVjdHMgPQotCQkvLyBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0JCS8vIHByb2plY3Quc2V0SW5wdXQoIHByb2plY3RzKTsKLQkJLy8gU3RyaW5nIHMgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZSgKLQkJLy8gSVhTTFRMYXVuY2hDb25maWd1cmF0aW9uLlBST0pFQ1QsICIiKTsKLQkJLy8gSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0JCS8vIGlmKCBzLmVxdWFscygiIikpCi0JCS8vIHsKLQkJLy8gaWYoIHByb2plY3RzLmxlbmd0aD4wKQotCQkvLyB7Ci0JCS8vIHByb2plY3QgPSBwcm9qZWN0c1sgMF07Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyBlbHNlCi0JCS8vIHByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoIHMpOwotCi0JCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBYU0xEZWJ1Z1VJUGx1Z2luLmdldEFjdGl2ZVBhZ2UoKTsKLQkJTGlzdDxPYmplY3Q+IHJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQlpZiAocGFnZSAhPSBudWxsKQotCQl7Ci0JCQkvLyB1c2Ugc2VsZWN0aW9ucyB0byBmaW5kIHRoZSBwcm9qZWN0Ci0JCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHBhZ2UuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JCQl7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3MgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ZXIgPSBzcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0JCQkJewotCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElSZXNvdXJjZSkKLQkJCQkJCXJlc291cmNlcy5hZGQoZWxlbWVudCk7Ci0JCQkJfQotCQkJCXJldHVybiAoSVJlc291cmNlW10pIHJlc291cmNlcy50b0FycmF5KG5ldyBJUmVzb3VyY2VbMF0pOwotCQkJfQotCQkJLy8gdXNlIGN1cnJlbnQgZWRpdG9yIHRvIGZpbmQgdGhlIHByb2plY3QKLQkJCUlFZGl0b3JQYXJ0IHBhcnQgPSBwYWdlLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJaWYgKHBhcnQgIT0gbnVsbCkKLQkJCXsKLQkJCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBwYXJ0LmdldEVkaXRvcklucHV0KCk7Ci0JCQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgaW5wdXQuZ2V0QWRhcHRlcihJRmlsZS5jbGFzcyk7Ci0JCQkJaWYgKGZpbGUgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIG5ldyBJUmVzb3VyY2VbXQotCQkJCQl7IGZpbGUgfTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3IElSZXNvdXJjZVswXTsKLQl9Ci0KLQlwcml2YXRlIElGaWxlIGdldFhNTElucHV0KElSZXNvdXJjZVtdIGNvbnRleHQpCi0JewotCQlmb3IgKElSZXNvdXJjZSByZXNvdXJjZSA6IGNvbnRleHQpCi0JCXsKLQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlICYmICgieG1sIi5lcXVhbHNJZ25vcmVDYXNlKHJlc291cmNlLmdldEZpbGVFeHRlbnNpb24oKSkgfHwgInhodG1sIi5lcXVhbHNJZ25vcmVDYXNlKHJlc291cmNlLmdldEZpbGVFeHRlbnNpb24oKSkpKQotCQkJCXJldHVybiAoSUZpbGUpIHJlc291cmNlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgSUZpbGVbXSBnZXRYU0xTdHlsZXNoZWV0cyhJUmVzb3VyY2VbXSBjb250ZXh0KQotCXsKLQkJTGlzdDxJUmVzb3VyY2U+IHN0eWxlc2hlZXRzID0gbmV3IEFycmF5TGlzdDxJUmVzb3VyY2U+KCk7Ci0JCWZvciAoSVJlc291cmNlIHJlc291cmNlIDogY29udGV4dCkKLQkJewotCQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUgJiYgInhzbCIuZXF1YWxzSWdub3JlQ2FzZShyZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCkpKQotCQkJCXN0eWxlc2hlZXRzLmFkZChyZXNvdXJjZSk7Ci0JCX0KLQkJcmV0dXJuIChJRmlsZVtdKSBzdHlsZXNoZWV0cy50b0FycmF5KG5ldyBJRmlsZVswXSk7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9vdXRwdXQvT3V0cHV0RmlsZUJsb2NrLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9vdXRwdXQvT3V0cHV0RmlsZUJsb2NrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMjYxYzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvb3V0cHV0L091dHB1dEZpbGVCbG9jay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5vdXRwdXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5SZXNvdXJjZVNlbGVjdGlvbkJsb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuWFNMRGVidWdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMubWFpbi5NYWluVGFiTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50czsKLQotcHVibGljIGNsYXNzIE91dHB1dEZpbGVCbG9jayBleHRlbmRzIFJlc291cmNlU2VsZWN0aW9uQmxvY2sKLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPVVRQVVRfTUVUSE9EX0RFRkFVTFQgPSAiPERlZmF1bHQ+IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPVVRQVVRfTUVUSE9EX1hNTCA9ICJ4bWwiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVFBVVF9NRVRIT0RfWEhUTUwgPSAieGh0bWwiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVFBVVF9NRVRIT0RfSFRNTCA9ICJodG1sIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPVVRQVVRfTUVUSE9EX1RFWFQgPSAidGV4dCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIE9VVFBVVF9NRVRIT0RTID0gbmV3IFN0cmluZ1tdCi0JeyBPVVRQVVRfTUVUSE9EX0RFRkFVTFQsIE9VVFBVVF9NRVRIT0RfWE1MLCBPVVRQVVRfTUVUSE9EX1hIVE1MLCBPVVRQVVRfTUVUSE9EX0hUTUwsIE9VVFBVVF9NRVRIT0RfVEVYVCB9OwotCXByaXZhdGUgQnV0dG9uIG9wZW5GaWxlQ2hlY2tCdXR0b247Ci0JLy8gcHJpdmF0ZSBDb21ib1ZpZXdlciBmb3JtYXRWaWV3ZXI7Ci0JLy8gcHJpdmF0ZSBDb21ibyBmb3JtYXRDb21ibzsKLQlwcml2YXRlIENvbWJvVmlld2VyIG1ldGhvZFZpZXdlcjsKLQlwcml2YXRlIFN0cmluZyBpbnB1dEZpbGVuYW1lOwotCi0JcHVibGljIE91dHB1dEZpbGVCbG9jaygpCi0JewotCQlzdXBlcihJUmVzb3VyY2UuRklMRSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TWVzc2FnZShpbnQgdHlwZSkKLQl7Ci0JCXN3aXRjaCAodHlwZSkKLQkJewotCQkJY2FzZSBFUlJPUl9ESVJFQ1RPUllfTk9UX1NQRUNJRklFRDoKLQkJCQlyZXR1cm4gTWFpblRhYk1lc3NhZ2VzLk91dHB1dEZPRmlsZUJsb2NrX0RJUkVDVE9SWV9OT1RfU1BFQ0lGSUVEOwotCQkJY2FzZSBFUlJPUl9ESVJFQ1RPUllfRE9FU19OT1RfRVhJU1Q6Ci0JCQkJcmV0dXJuIE1haW5UYWJNZXNzYWdlcy5PdXRwdXRGT0ZpbGVCbG9ja19ESVJFQ1RPUllfRE9FU19OT1RfRVhJU1Q7Ci0JCQljYXNlIEdST1VQX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgVVNFX0RFRkFVTFRfUkFESU86Ci0JCQkJcmV0dXJuICJVc2UgZGVmYXVsdCBsb2NhdGlvbiI7Ci0JCQljYXNlIFVTRV9PVEhFUl9SQURJTzoKLQkJCQlyZXR1cm4gTWFpblRhYk1lc3NhZ2VzLk91dHB1dEZPRmlsZUJsb2NrX09USEVSX1JBRElPOwotCQkJY2FzZSBESVJFQ1RPUllfRElBTE9HX01FU1NBR0U6Ci0JCQkJcmV0dXJuIE1haW5UYWJNZXNzYWdlcy5PdXRwdXRGT0ZpbGVCbG9ja19ESUFMT0dfTUVTU0FHRTsKLQkJCWNhc2UgV09SS1NQQUNFX0RJQUxPR19NRVNTQUdFOgotCQkJCXJldHVybiBNYWluVGFiTWVzc2FnZXMuT3V0cHV0Rk9GaWxlQmxvY2tfV09SS1NQQUNFX0RJQUxPR19NRVNTQUdFOwotCQkJY2FzZSBWQVJJQUJMRVNfQlVUVE9OOgotCQkJCXJldHVybiBNYWluVGFiTWVzc2FnZXMuT3V0cHV0Rk9GaWxlQmxvY2tfVkFSSUFCTEVTX0JVVFRPTjsKLQkJCWNhc2UgRklMRV9TWVNURU1fQlVUVE9OOgotCQkJCXJldHVybiBNYWluVGFiTWVzc2FnZXMuT3V0cHV0Rk9GaWxlQmxvY2tfRklMRV9TWVNURU1fQlVUVE9OOwotCQkJY2FzZSBXT1JLU1BBQ0VfQlVUVE9OOgotCQkJCXJldHVybiBNYWluVGFiTWVzc2FnZXMuT3V0cHV0Rk9GaWxlQmxvY2tfV09SS1NQQUNFX0JVVFRPTjsKLQkJCWNhc2UgV09SS1NQQUNFX0RJQUxPR19USVRMRToKLQkJCQlyZXR1cm4gTWFpblRhYk1lc3NhZ2VzLk91dHB1dEZPRmlsZUJsb2NrX1dPUktTUEFDRV9ESUFMT0dfVElUTEU7Ci0JCX0KLQkJcmV0dXJuICIiICsgdHlwZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0UmVzb3VyY2UoKQotCXt9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KQotCXsKLQkJLy8gQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCxTV1QuTk9ORSk7Ci0JCS8vIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLFNXVC5GSUxMLHRydWUsZmFsc2UpOwotCQkvLyBnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCS8vIGNvbXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCS8vIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMix0cnVlKTsKLQkJLy8gbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCS8vIGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCS8vIGNvbXAuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJLy8gY3JlYXRlTWV0aG9kQ29tYm8oY29tcCk7Ci0JCS8vIGNyZWF0ZUZvcm1hdENvbWJvKGNvbXApOwotCi0JCS8vIG1ldGhvZFZpZXdlci5zZXRJbnB1dCgiIik7Ci0JCS8vIGZvcm1hdFZpZXdlci5zZXRJbnB1dCgiIik7Ci0KLQkJLy8gbWV0aG9kVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigieG1sIiksIHRydWUpOwotCQkvLyBmb3JtYXRWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCI8bm9uZT4iKSwgdHJ1ZSk7Ci0KLQkJZmlsZUxhYmVsID0gIkxvY2F0aW9uOiI7Ci0JCWNyZWF0ZUNoZWNrYm94QW5kVGV4dChwYXJlbnQpOwotCQljcmVhdGVCdXR0b25zKHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9ucyhDb21wb3NpdGUgcGFyZW50KQotCXsKLQkJb3BlbkZpbGVDaGVja0J1dHRvbiA9IGNyZWF0ZUNoZWNrQnV0dG9uKHBhcmVudCwgIk9wZW4gZmlsZSBvbiBjb21wbGV0aW9uIik7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQlvcGVuRmlsZUNoZWNrQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQlvcGVuRmlsZUNoZWNrQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpCi0JCXsKLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0JCQl7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0JCQl7Ci0JCQkJdXBkYXRlTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZygpOwotCQkJfQotCQl9KTsKLQotCQlDb21wb3NpdGUgYnV0dG9uQ29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJYnV0dG9uQ29tcC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCWJ1dHRvbkNvbXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWJ1dHRvbkNvbXAuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQotCQlmV29ya3NwYWNlQnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihidXR0b25Db21wLCBnZXRNZXNzYWdlKFdPUktTUEFDRV9CVVRUT04pLCBudWxsKTsKLQkJZldvcmtzcGFjZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih3aWRnZXRMaXN0ZW5lcik7Ci0KLQkJZkZpbGVTeXN0ZW1CdXR0b24gPSBjcmVhdGVQdXNoQnV0dG9uKGJ1dHRvbkNvbXAsIGdldE1lc3NhZ2UoRklMRV9TWVNURU1fQlVUVE9OKSwgbnVsbCk7Ci0JCWZGaWxlU3lzdGVtQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHdpZGdldExpc3RlbmVyKTsKLQotCQlmVmFyaWFibGVzQnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihidXR0b25Db21wLCBnZXRNZXNzYWdlKFZBUklBQkxFU19CVVRUT04pLCBudWxsKTsKLQkJZlZhcmlhYmxlc0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih3aWRnZXRMaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JCXJldHVybiAiT3V0cHV0IEZpbGUiOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pCi0JewotCQl0cnkKLQkJewotCQkJU3RyaW5nIG91dHB1dE1ldGhvZCA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9PVVRQVVRfTUVUSE9ELCBPVVRQVVRfTUVUSE9EU1swXSk7Ci0JCQkvLyBtZXRob2RWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG91dHB1dE1ldGhvZCksCi0JCQkvLyB0cnVlKTsKLQotCQkJaW5wdXRGaWxlbmFtZSA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9JTlBVVF9GSUxFLCAiIik7Ci0JCQkvLyBTdHJpbmcgcmVuZGVyVG8gPQotCQkJLy8gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1JFTkRFUl9UTywKLQkJCS8vICIiKTsKLQkJCXVwZGF0ZURlZmF1bHRPdXRwdXRGaWxlKCk7Ci0KLQkJCWJvb2xlYW4gdXNlRGVmYXVsdCA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9VU0VfREVGQVVMVF9PVVRQVVRfRklMRSwgdHJ1ZSk7Ci0JCQl1c2VEZWZhdWx0Q2hlY2tCdXR0b24uc2V0U2VsZWN0aW9uKHVzZURlZmF1bHQpOwotCi0JCQlvdXRwdXRGaWxlID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX09VVFBVVF9GSUxFLCBkZWZhdWx0T3V0cHV0RmlsZSk7Ci0KLQkJCXVwZGF0ZVJlc291cmNlVGV4dCh1c2VEZWZhdWx0KTsKLQotCQkJYm9vbGVhbiBvcGVuRmlsZU9uQ29tcGxldGlvbiA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9PUEVOX0ZJTEUsIHRydWUpOwotCQkJb3BlbkZpbGVDaGVja0J1dHRvbi5zZXRTZWxlY3Rpb24ob3BlbkZpbGVPbkNvbXBsZXRpb24pOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0JCXsKLQkJCVhTTERlYnVnVUlQbHVnaW4ubG9nKGUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybUFwcGx5KElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlndXJhdGlvbikKLQl7Ci0JCWJvb2xlYW4gdXNlRGVmYXVsdCA9IHVzZURlZmF1bHRDaGVja0J1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1VTRV9ERUZBVUxUX09VVFBVVF9GSUxFLCB1c2VEZWZhdWx0KTsKLQotCQlTdHJpbmcgb3V0cHV0RmlsZSA9IHJlc291cmNlVGV4dC5nZXRUZXh0KCk7Ci0JCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9PVVRQVVRfRklMRSwgb3V0cHV0RmlsZSk7Ci0KLQkJLy8gU3RyaW5nIG91dHB1dE1ldGhvZCA9Ci0JCS8vIChTdHJpbmcpKChJU3RydWN0dXJlZFNlbGVjdGlvbiltZXRob2RWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCQkvLyBvdXRwdXRNZXRob2QgPSBvdXRwdXRNZXRob2QgPT0gT1VUUFVUX01FVEhPRFNbMF0gPyBudWxsIDoKLQkJLy8gb3V0cHV0TWV0aG9kOwotCQkvLyBjb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfT1VUUFVUX01FVEhPRCwKLQkJLy8gb3V0cHV0TWV0aG9kKTsKLQotCQlib29sZWFuIG9wZW5GaWxlT25Db21wbGV0aW9uID0gb3BlbkZpbGVDaGVja0J1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX09QRU5fRklMRSwgb3BlbkZpbGVPbkNvbXBsZXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRzKElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlndXJhdGlvbikKLQl7Ci0JCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9VU0VfREVGQVVMVF9PVVRQVVRfRklMRSwgdHJ1ZSk7Ci0JCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9PVVRQVVRfRklMRSwgIiIpOwotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfT1VUUFVUX01FVEhPRCwgKFN0cmluZykgbnVsbCk7Ci0JCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9PUEVOX0ZJTEUsIHRydWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZURlZmF1bHRPdXRwdXRGaWxlKCkKLQl7Ci0JCVN0cmluZyBtZXRob2QgPSBPVVRQVVRfTUVUSE9EX1hNTDsKLQkJaWYgKG1ldGhvZFZpZXdlciAhPSBudWxsKQotCQkJbWV0aG9kID0gKFN0cmluZykgKChJU3RydWN0dXJlZFNlbGVjdGlvbikgbWV0aG9kVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJaWYgKE9VVFBVVF9NRVRIT0RfREVGQVVMVC5lcXVhbHMobWV0aG9kKSkKLQkJCW1ldGhvZCA9IE9VVFBVVF9NRVRIT0RfWE1MOwotCi0JCVN0cmluZyBmaWxlID0gaW5wdXRGaWxlbmFtZTsKLQkJaW50IGluZGV4ID0gaW5wdXRGaWxlbmFtZS5sYXN0SW5kZXhPZignLicpOwotCQlpZiAoaW5kZXggIT0gLTEpCi0JCQlmaWxlID0gaW5wdXRGaWxlbmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQlmaWxlICs9ICIub3V0LiIgKyBtZXRob2Q7Ci0JCWlmIChpbnB1dEZpbGVuYW1lLnRyaW0oKS5lbmRzV2l0aCgifSIpKQotCQkJZmlsZSArPSAifSI7Ci0KLQkJZGVmYXVsdE91dHB1dEZpbGUgPSBmaWxlOwotCi0JCXVwZGF0ZVJlc291cmNlVGV4dChvcGVuRmlsZUNoZWNrQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9vdXRwdXQvT3V0cHV0UHJvcGVydGllc0Jsb2NrLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9vdXRwdXQvT3V0cHV0UHJvcGVydGllc0Jsb2NrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4Y2JiNmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvb3V0cHV0L091dHB1dFByb3BlcnRpZXNCbG9jay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5vdXRwdXQ7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxNb2RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRleHRDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLkFic3RyYWN0VGFibGVCbG9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLlhTTERlYnVnVUlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5YU0xEZWJ1Z1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkucHJlZmVyZW5jZXMuT3V0cHV0UHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLm1haW4uWFNMTWFpblRhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5JT3V0cHV0UHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuSVByb2Nlc3Nvckluc3RhbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuSVByb2Nlc3NvclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5YU0xUUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5jb25maWcuTGF1bmNoUHJvcGVydGllczsKLQotcHVibGljIGNsYXNzIE91dHB1dFByb3BlcnRpZXNCbG9jayBleHRlbmRzIEFic3RyYWN0VGFibGVCbG9jawotewotCXByaXZhdGUgVGFibGUgdGFibGU7Ci0JcHJpdmF0ZSBUYWJsZVZpZXdlciB0Vmlld2VyOwotCXByaXZhdGUgVGV4dCBkZXNjcmlwdGlvblRleHQ7Ci0JcHJpdmF0ZSBJUHJvY2Vzc29yVHlwZSBwcm9jZXNzb3JUeXBlOwotCXByaXZhdGUgZmluYWwgTWFwPElQcm9jZXNzb3JUeXBlLCBMYXVuY2hQcm9wZXJ0aWVzPiB0eXBlUHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPElQcm9jZXNzb3JUeXBlLCBMYXVuY2hQcm9wZXJ0aWVzPigpOwotCXByaXZhdGUgQnV0dG9uIHVzZVByb3BlcnRpZXNGcm9tUHJlZmVyZW5jZXNSYWRpbzsKLQlwcml2YXRlIEJ1dHRvbiBjaGFuZ2VQcmVmZXJlbmNlczsKLQlwcml2YXRlIEJ1dHRvbiB1c2VTcGVjaWZpY1Byb3BlcnRpZXNSYWRpbzsKLQlwcml2YXRlIExhdW5jaFByb3BlcnRpZXMgbGF1bmNoUHJvcGVydGllczsKLQotCXB1YmxpYyBPdXRwdXRQcm9wZXJ0aWVzQmxvY2soWFNMTWFpblRhYiBtYWluKQotCXsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSURpYWxvZ1NldHRpbmdzIGdldERpYWxvZ1NldHRpbmdzKCkKLQl7Ci0JCXJldHVybiBYU0xEZWJ1Z1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UXVhbGlmaWVyKCkKLQl7Ci0JCXJldHVybiBYU0xEZWJ1Z1VJQ29uc3RhbnRzLk9VVFBVVF9CTE9DSzsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVGFibGUgZ2V0VGFibGUoKQotCXsKLQkJcmV0dXJuIHRhYmxlOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLQl7Ci0JCXVzZVByb3BlcnRpZXNGcm9tUHJlZmVyZW5jZXNSYWRpbyA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUkFESU8pOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShTV1QuTEVGVCwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKTsKLQkJdXNlUHJvcGVydGllc0Zyb21QcmVmZXJlbmNlc1JhZGlvLnNldExheW91dERhdGEoZ2QpOwotCQl1c2VQcm9wZXJ0aWVzRnJvbVByZWZlcmVuY2VzUmFkaW8uc2V0VGV4dCgiVXNlIHByb3BlcnRpZXMgZnJvbSBwcmVmZXJlbmNlcyIpOwotCQl1c2VQcm9wZXJ0aWVzRnJvbVByZWZlcmVuY2VzUmFkaW8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkKLQkJewotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLQkJCXsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLQkJCXsKLQkJCQloYW5kbGVVc2VQcm9wZXJ0aWVzRnJvbVByZWZlcmVuY2VzKHRydWUpOwotCQkJCXVwZGF0ZUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coKTsKLQkJCX0KLQkJfSk7Ci0KLQkJY2hhbmdlUHJlZmVyZW5jZXMgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotCQljaGFuZ2VQcmVmZXJlbmNlcy5zZXRUZXh0KCJDaGFuZ2UgUHJlZmVyZW5jZXMuLi4iKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoU1dULlJJR0hULCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpOwotCQljaGFuZ2VQcmVmZXJlbmNlcy5zZXRMYXlvdXREYXRhKGdkKTsKLQkJY2hhbmdlUHJlZmVyZW5jZXMuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0JCQl7Ci0JCQkJSVByZWZlcmVuY2VQYWdlIHBhZ2UgPSBuZXcgT3V0cHV0UHJlZmVyZW5jZVBhZ2UoKTsKLQkJCQlYU0xEZWJ1Z1VJUGx1Z2luLnNob3dQcmVmZXJlbmNlUGFnZSgib3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS5vdXRwdXQiLCBwYWdlKTsKLQkJCQloYW5kbGVVc2VQcm9wZXJ0aWVzRnJvbVByZWZlcmVuY2VzKHRydWUpOwotCQkJfQotCQl9KTsKLQotCQl1c2VTcGVjaWZpY1Byb3BlcnRpZXNSYWRpbyA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUkFESU8pOwotCQlnZCA9IG5ldyBHcmlkRGF0YShTV1QuTEVGVCwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKTsKLQkJdXNlU3BlY2lmaWNQcm9wZXJ0aWVzUmFkaW8uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXVzZVNwZWNpZmljUHJvcGVydGllc1JhZGlvLnNldFRleHQoIlVzZSBzcGVjaWZpYyBwcm9wZXJ0aWVzIik7Ci0JCXVzZVNwZWNpZmljUHJvcGVydGllc1JhZGlvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpCi0JCXsKLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0JCQl7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0JCQl7Ci0JCQkJaGFuZGxlVXNlUHJvcGVydGllc0Zyb21QcmVmZXJlbmNlcyhmYWxzZSk7Ci0JCQkJdXBkYXRlTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZygpOwotCQkJfQotCQl9KTsKLQotCQkvLyBmaWxsZXIKLQkJbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCi0JCXRhYmxlID0gbmV3IFRhYmxlKHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5WX1NDUk9MTCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJc2V0Q29udHJvbCh0YWJsZSk7Ci0KLQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCi0JCVRhYmxlQ29sdW1uIGMxID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWMxLnNldFdpZHRoKDE1MCk7Ci0JCWMxLnNldFJlc2l6YWJsZSh0cnVlKTsKLQkJYzEuc2V0VGV4dCgiUHJvcGVydHkiKTsKLQotCQlUYWJsZUNvbHVtbiBjMiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljMi5zZXRXaWR0aCgyNTApOwotCQljMi5zZXRSZXNpemFibGUodHJ1ZSk7Ci0JCWMyLnNldFRleHQoIlZhbHVlIik7Ci0KLQkJdFZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcih0YWJsZSk7Ci0JCXRWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcigpCi0JCXsKLQotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpCi0JCQl7Ci0JCQkJcmV0dXJuIGxhdW5jaFByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpLmtleVNldCgpLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotCQkJewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpCi0JCQl7Ci0KLQkJCX0KLQkJfSk7Ci0JCXRWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgSVRhYmxlTGFiZWxQcm92aWRlcigpCi0JCXsKLQotCQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpCi0JCQl7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KQotCQkJewotCQkJCVN0cmluZyBwcm9wID0gKFN0cmluZykgZWxlbWVudDsKLQkJCQlzd2l0Y2ggKGNvbHVtbkluZGV4KQotCQkJCXsKLQkJCQkJY2FzZSAwOgotCQkJCQkJcmV0dXJuIHByb3A7Ci0JCQkJCWNhc2UgMToKLQkJCQkJCXJldHVybiBsYXVuY2hQcm9wZXJ0aWVzLmdldFByb3BlcnR5KHByb3ApOwotCQkJCX0KLQkJCQlyZXR1cm4gIiEhIjsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikKLQkJCXsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpCi0JCQl7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KQotCQkJewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikKLQkJCXsKLQkJCX0KLQotCQl9KTsKLQkJdFZpZXdlci5zZXRDb2x1bW5Qcm9wZXJ0aWVzKG5ldyBTdHJpbmdbXQotCQl7ICJwcm9wZXJ0eSIsICJ2YWx1ZSIgfSk7Ci0JCXRWaWV3ZXIuc2V0Q2VsbE1vZGlmaWVyKG5ldyBJQ2VsbE1vZGlmaWVyKCkKLQkJewotCQkJcHVibGljIGJvb2xlYW4gY2FuTW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpCi0JCQl7Ci0JCQkJaWYgKCEidmFsdWUiLmVxdWFscyhwcm9wZXJ0eSkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJcHVibGljIE9iamVjdCBnZXRWYWx1ZShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KQotCQkJewotCQkJCVN0cmluZyBwcm9wID0gKFN0cmluZykgZWxlbWVudDsKLQkJCQlTdHJpbmcgdmFsdWUgPSBsYXVuY2hQcm9wZXJ0aWVzLmdldFByb3BlcnR5KHByb3ApOwotCQkJCXJldHVybiB2YWx1ZSA9PSBudWxsID8gIiIgOiB2YWx1ZTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHksIE9iamVjdCB2YWx1ZSkKLQkJCXsKLQkJCQlJdGVtIGl0ZW0gPSAoSXRlbSkgZWxlbWVudDsKLQkJCQlTdHJpbmcgcHJvcCA9IChTdHJpbmcpIGl0ZW0uZ2V0RGF0YSgpOwotCQkJCWlmICh2YWx1ZSA9PSBudWxsIHx8ICIiLmVxdWFscyh2YWx1ZSkpCi0JCQkJCWxhdW5jaFByb3BlcnRpZXMucmVtb3ZlUHJvcGVydHkocHJvcCk7Ci0JCQkJZWxzZQotCQkJCQlsYXVuY2hQcm9wZXJ0aWVzLnNldFByb3BlcnR5KHByb3AsIChTdHJpbmcpIHZhbHVlKTsKLQkJCQl0Vmlld2VyLnVwZGF0ZShwcm9wLCBudWxsKTsKLQkJCQl1cGRhdGVMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKCk7Ci0JCQl9Ci0JCX0pOwotCQl0Vmlld2VyLnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpCi0JCQl7Ci0JCQkJU3RyaW5nIHByb3AxID0gKFN0cmluZykgZTE7Ci0JCQkJU3RyaW5nIHByb3AyID0gKFN0cmluZykgZTI7Ci0JCQkJcmV0dXJuIHByb3AxLmNvbXBhcmVUbyhwcm9wMik7Ci0JCQl9Ci0JCX0pOwotCQl0Vmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpCi0JCXsKLQotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0JCQl7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJCQlTdHJpbmcgcHJvcCA9IChTdHJpbmcpIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCQkJaWYgKHByb3AgIT0gbnVsbCkKLQkJCQl7Ci0JCQkJCUlQcm9jZXNzb3JUeXBlW10gdHlwZXMgPSBYU0xUUnVudGltZS5nZXRQcm9jZXNzb3JUeXBlcygpOwotCQkJCQlvdXRlcjogZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykKLQkJCQkJewotCQkJCQkJSVByb2Nlc3NvclR5cGUgcHJvY2Vzc29yVHlwZSA9IHR5cGVzW2ldOwotCQkJCQkJSU91dHB1dFByb3BlcnR5W10gcHJvcGVydHkgPSBwcm9jZXNzb3JUeXBlLmdldE91dHB1dFByb3BlcnRpZXMoKTsKLQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcHJvcGVydHkubGVuZ3RoOyBqKyspCi0JCQkJCQl7Ci0JCQkJCQkJSU91dHB1dFByb3BlcnR5IG91dHB1dFByb3BlcnR5ID0gcHJvcGVydHlbal07Ci0JCQkJCQkJaWYgKG91dHB1dFByb3BlcnR5LmdldFVSSSgpLmVxdWFscyhwcm9wKSkKLQkJCQkJCQl7Ci0JCQkJCQkJCXRleHQgPSBvdXRwdXRQcm9wZXJ0eS5nZXREZXNjcmlwdGlvbigpOwotCQkJCQkJCQlicmVhayBvdXRlcjsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZGVzY3JpcHRpb25UZXh0LnNldFRleHQodGV4dCA9PSBudWxsID8gIiIgOiB0ZXh0KTsKLQkJCX0KLQkJfSk7Ci0KLQkJVGV4dENlbGxFZGl0b3IgZWRpdG9yID0gbmV3IFRleHRDZWxsRWRpdG9yKHRhYmxlKTsKLQotCQlDZWxsRWRpdG9yW10gZWRpdG9ycyA9IG5ldyBDZWxsRWRpdG9yW10KLQkJeyBudWxsLCBlZGl0b3IgfTsKLQkJdFZpZXdlci5zZXRDZWxsRWRpdG9ycyhlZGl0b3JzKTsKLQotCQlkZXNjcmlwdGlvblRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZIHwgU1dULlZfU0NST0xMIHwgU1dULldSQVApOwotCQlnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULk5PTkUsIHRydWUsIGZhbHNlKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlnZC5oZWlnaHRIaW50ID0gNTA7Ci0JCWRlc2NyaXB0aW9uVGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQkvLyBtdXN0IGNvbWUgYWZ0ZXIgaW5wdXQgaGFzIGJlZW4gc2V0Ci0JCXJlc3RvcmVDb2x1bW5TZXR0aW5ncygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVVc2VQcm9wZXJ0aWVzRnJvbVByZWZlcmVuY2VzKGJvb2xlYW4gc2VsZWN0ZWQpCi0JewotCQljaGFuZ2VQcmVmZXJlbmNlcy5zZXRFbmFibGVkKHNlbGVjdGVkKTsKLQkJdGFibGUuc2V0RW5hYmxlZCghc2VsZWN0ZWQpOwotCi0JCWlmIChzZWxlY3RlZCkKLQkJewotCQkJbGF1bmNoUHJvcGVydGllcyA9IGluaXRpYWxpemVGZWF0dXJlc0Zyb21QcmVmZXJlbmNlcygpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJbGF1bmNoUHJvcGVydGllcyA9IChMYXVuY2hQcm9wZXJ0aWVzKSB0eXBlUHJvcGVydGllcy5nZXQocHJvY2Vzc29yVHlwZSk7Ci0KLQkJCWlmIChsYXVuY2hQcm9wZXJ0aWVzID09IG51bGwpCi0JCQl7Ly8gbWFrZSBhIGNvcHkgb2YgdGhlIGZlYXR1cmVzIGZvciB0aGUgcHJvY2Vzc29yIHR5cGUKLQkJCQlsYXVuY2hQcm9wZXJ0aWVzID0gbmV3IExhdW5jaFByb3BlcnRpZXMoKTsKLQkJCQl0eXBlUHJvcGVydGllcy5wdXQocHJvY2Vzc29yVHlwZSwgbGF1bmNoUHJvcGVydGllcyk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9jZXNzb3JUeXBlLmdldE91dHB1dFByb3BlcnRpZXMoKS5sZW5ndGg7IGkrKykKLQkJCQl7Ci0JCQkJCUlPdXRwdXRQcm9wZXJ0eSBwcm9wZXJ0eSA9IHByb2Nlc3NvclR5cGUuZ2V0T3V0cHV0UHJvcGVydGllcygpW2ldOwotCQkJCQlsYXVuY2hQcm9wZXJ0aWVzLnNldFByb3BlcnR5KHByb3BlcnR5LmdldFVSSSgpLCBudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJdFZpZXdlci5zZXRJbnB1dChsYXVuY2hQcm9wZXJ0aWVzKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkJcmV0dXJuICJPdXRwdXQgUHJvcGVydGllcyI7Ci0JfQotCi0JcHJpdmF0ZSBMYXVuY2hQcm9wZXJ0aWVzIGluaXRpYWxpemVGZWF0dXJlc0Zyb21QcmVmZXJlbmNlcygpCi0JewotCQlMYXVuY2hQcm9wZXJ0aWVzIHByZWZlcmVuY2VzID0gbmV3IExhdW5jaFByb3BlcnRpZXMoKTsKLQotCQlJUHJvY2Vzc29yVHlwZSBqcmVEZWZhdWx0VHlwZSA9IFhTTFRSdW50aW1lLmdldFByb2Nlc3NvclR5cGUoWFNMVFJ1bnRpbWUuSlJFX0RFRkFVTFRfUFJPQ0VTU09SX1RZUEVfSUQpOwotCQlJT3V0cHV0UHJvcGVydHlbXSBmZWF0dXJlcyA9IGpyZURlZmF1bHRUeXBlLmdldE91dHB1dFByb3BlcnRpZXMoKTsKLQkJTWFwPD8sID8+IHZhbHVlcyA9IGpyZURlZmF1bHRUeXBlLmdldE91dHB1dFByb3BlcnR5VmFsdWVzKCk7Ci0JCWZvciAoSU91dHB1dFByb3BlcnR5IGZlYXR1cmUgOiBmZWF0dXJlcykKLQkJewotCQkJU3RyaW5nIGtleSA9IGZlYXR1cmUuZ2V0VVJJKCk7Ci0JCQlwcmVmZXJlbmNlcy5zZXRQcm9wZXJ0eShrZXksIChTdHJpbmcpIHZhbHVlcy5nZXQoa2V5KSk7Ci0JCX0KLQotCQlmZWF0dXJlcyA9IHByb2Nlc3NvclR5cGUuZ2V0T3V0cHV0UHJvcGVydGllcygpOwotCQl2YWx1ZXMgPSBwcm9jZXNzb3JUeXBlLmdldE91dHB1dFByb3BlcnR5VmFsdWVzKCk7Ci0JCWZvciAoSU91dHB1dFByb3BlcnR5IGZlYXR1cmUgOiBmZWF0dXJlcykKLQkJewotCQkJU3RyaW5nIGtleSA9IGZlYXR1cmUuZ2V0VVJJKCk7Ci0JCQlwcmVmZXJlbmNlcy5zZXRQcm9wZXJ0eShrZXksIChTdHJpbmcpIHZhbHVlcy5nZXQoa2V5KSk7Ci0JCX0KLQotCQlyZXR1cm4gcHJlZmVyZW5jZXM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVGZWF0dXJlc0Zyb21TdG9yYWdlKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlMYXVuY2hQcm9wZXJ0aWVzIGxhdW5jaEZlYXR1cmVzID0gbmV3IExhdW5jaFByb3BlcnRpZXMoKTsKLQotCQlJUHJvY2Vzc29yVHlwZSBqcmVEZWZhdWx0VHlwZSA9IFhTTFRSdW50aW1lLmdldFByb2Nlc3NvclR5cGUoWFNMVFJ1bnRpbWUuSlJFX0RFRkFVTFRfUFJPQ0VTU09SX1RZUEVfSUQpOwotCQlJT3V0cHV0UHJvcGVydHlbXSBkZWZhdWx0UHJvcHMgPSBqcmVEZWZhdWx0VHlwZS5nZXRPdXRwdXRQcm9wZXJ0aWVzKCk7Ci0JCWZvciAoSU91dHB1dFByb3BlcnR5IGZlYXR1cmUgOiBkZWZhdWx0UHJvcHMpCi0JCXsKLQkJCVN0cmluZyBrZXkgPSBmZWF0dXJlLmdldFVSSSgpOwotCQkJbGF1bmNoRmVhdHVyZXMuc2V0UHJvcGVydHkoa2V5LCBudWxsKTsKLQkJfQotCQlJT3V0cHV0UHJvcGVydHlbXSBzcGVjaWZpY1Byb3BzID0gcHJvY2Vzc29yVHlwZS5nZXRPdXRwdXRQcm9wZXJ0aWVzKCk7Ci0JCWZvciAoSU91dHB1dFByb3BlcnR5IGZlYXR1cmUgOiBzcGVjaWZpY1Byb3BzKQotCQl7Ci0JCQlTdHJpbmcga2V5ID0gZmVhdHVyZS5nZXRVUkkoKTsKLQkJCWxhdW5jaEZlYXR1cmVzLnNldFByb3BlcnR5KGtleSwgbnVsbCk7Ci0JCX0KLQotCQlTdHJpbmcgcyA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9PVVRQVVRfUFJPUEVSVElFUywgKFN0cmluZykgbnVsbCk7Ci0JCWlmIChzICE9IG51bGwgJiYgcy5sZW5ndGgoKSA+IDApCi0JCXsKLQkJCUxhdW5jaFByb3BlcnRpZXMgb3ZlcnJpZGVGZWF0dXJlcyA9IExhdW5jaFByb3BlcnRpZXMuZnJvbVhNTChuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocy5nZXRCeXRlcygpKSk7Ci0JCQlJT3V0cHV0UHJvcGVydHlbXSBwcm9wcyA9IG5ldyBJT3V0cHV0UHJvcGVydHlbc3BlY2lmaWNQcm9wcy5sZW5ndGggKyBkZWZhdWx0UHJvcHMubGVuZ3RoXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoc3BlY2lmaWNQcm9wcywgMCwgcHJvcHMsIDAsIHNwZWNpZmljUHJvcHMubGVuZ3RoKTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoZGVmYXVsdFByb3BzLCAwLCBwcm9wcywgc3BlY2lmaWNQcm9wcy5sZW5ndGgsIGRlZmF1bHRQcm9wcy5sZW5ndGgpOwotCQkJZm9yIChJdGVyYXRvcjw/PiBpdGVyYXRvciA9IG92ZXJyaWRlRmVhdHVyZXMuZ2V0UHJvcGVydGllcygpLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0JCQl7Ci0JCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlsYXVuY2hGZWF0dXJlcy5yZW1vdmVQcm9wZXJ0eShrZXkpOwotCQkJCWZvciAoSU91dHB1dFByb3BlcnR5IHByb3AgOiBwcm9wcykKLQkJCQl7Ci0JCQkJCWlmIChwcm9wLmdldFVSSSgpLmVxdWFscyhrZXkpKQotCQkJCQl7Ci0JCQkJCQlsYXVuY2hGZWF0dXJlcy5zZXRQcm9wZXJ0eShrZXksIG92ZXJyaWRlRmVhdHVyZXMuZ2V0UHJvcGVydHkoa2V5KSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXR5cGVQcm9wZXJ0aWVzLnB1dChwcm9jZXNzb3JUeXBlLCBsYXVuY2hGZWF0dXJlcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikKLQl7Ci0JCXRyeQotCQl7Ci0JCQlTdHJpbmcgcHJvY2Vzc29ySWQgPSBudWxsOwotCQkJYm9vbGVhbiB1c2VEZWZhdWx0UHJvY2Vzc29yID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1VTRV9ERUZBVUxUX1BST0NFU1NPUiwgdHJ1ZSk7Ci0JCQlpZiAodXNlRGVmYXVsdFByb2Nlc3NvcikKLQkJCQlwcm9jZXNzb3JJZCA9IFhTTFRSdW50aW1lLmdldERlZmF1bHRQcm9jZXNzb3IoKS5nZXRJZCgpOwotCQkJZWxzZQotCQkJCXByb2Nlc3NvcklkID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BST0NFU1NPUiwgWFNMVFJ1bnRpbWUuSlJFX0RFRkFVTFRfUFJPQ0VTU09SX0lEKTsKLQotCQkJSVByb2Nlc3Nvckluc3RhbGwgcHJvY2Vzc29yID0gWFNMVFJ1bnRpbWUuZ2V0UHJvY2Vzc29yKHByb2Nlc3NvcklkKTsKLQkJCWlmIChwcm9jZXNzb3IgIT0gbnVsbCkKLQkJCQlwcm9jZXNzb3JUeXBlID0gcHJvY2Vzc29yLmdldFByb2Nlc3NvclR5cGUoKTsKLQkJCWVsc2UKLQkJCQlwcm9jZXNzb3JUeXBlID0gWFNMVFJ1bnRpbWUuZ2V0RGVmYXVsdFByb2Nlc3NvcigpLmdldFByb2Nlc3NvclR5cGUoKTsKLQotCQkJaW5pdGlhbGl6ZUZlYXR1cmVzRnJvbVN0b3JhZ2UoY29uZmlndXJhdGlvbik7Ci0KLQkJCWJvb2xlYW4gdXNlRmVhdHVyZXNGcm9tUHJlZmVyZW5jZXMgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfVVNFX1BST1BFUlRJRVNfRlJPTV9QUkVGRVJFTkNFUywgdHJ1ZSk7Ci0KLQkJCXVzZVNwZWNpZmljUHJvcGVydGllc1JhZGlvLnNldFNlbGVjdGlvbighdXNlRmVhdHVyZXNGcm9tUHJlZmVyZW5jZXMpOwotCQkJdXNlUHJvcGVydGllc0Zyb21QcmVmZXJlbmNlc1JhZGlvLnNldFNlbGVjdGlvbih1c2VGZWF0dXJlc0Zyb21QcmVmZXJlbmNlcyk7Ci0JCQloYW5kbGVVc2VQcm9wZXJ0aWVzRnJvbVByZWZlcmVuY2VzKHVzZUZlYXR1cmVzRnJvbVByZWZlcmVuY2VzKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotCQl7Ci0JCQlYU0xEZWJ1Z1VJUGx1Z2luLmxvZyhlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1BcHBseShJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24pCi0JewotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfVVNFX1BST1BFUlRJRVNfRlJPTV9QUkVGRVJFTkNFUywgdXNlUHJvcGVydGllc0Zyb21QcmVmZXJlbmNlc1JhZGlvLmdldFNlbGVjdGlvbigpKTsKLQkJU3RyaW5nIHhtbDsKLQkJdHJ5Ci0JCXsKLQkJCXhtbCA9IGxhdW5jaFByb3BlcnRpZXMudG9YTUwoKTsKLQkJCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9PVVRQVVRfUFJPUEVSVElFUywgeG1sKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpCi0JCXsKLQkJCVhTTERlYnVnVUlQbHVnaW4ubG9nKGUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdHMoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uKQotCXsKLQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1VTRV9QUk9QRVJUSUVTX0ZST01fUFJFRkVSRU5DRVMsIHRydWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL291dHB1dC9PdXRwdXRUYWIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL291dHB1dC9PdXRwdXRUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODllY2M0MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9vdXRwdXQvT3V0cHV0VGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMub3V0cHV0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5YU0xMYXVuY2hDb25maWd1cmF0aW9uVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5tYWluLlhTTE1haW5UYWI7Ci0KLXB1YmxpYyBjbGFzcyBPdXRwdXRUYWIgZXh0ZW5kcyBYU0xMYXVuY2hDb25maWd1cmF0aW9uVGFiCi17Ci0JcHJpdmF0ZSBmaW5hbCBPdXRwdXRQcm9wZXJ0aWVzQmxvY2sgb3V0cHV0QmxvY2s7Ci0JcHJpdmF0ZSBmaW5hbCBPdXRwdXRGaWxlQmxvY2sgb3V0cHV0RmlsZUJsb2NrOwotCi0JcHVibGljIE91dHB1dFRhYihYU0xNYWluVGFiIG1haW4pCi0JewotCQlvdXRwdXRGaWxlQmxvY2sgPSBuZXcgT3V0cHV0RmlsZUJsb2NrKCk7Ci0JCW91dHB1dEJsb2NrID0gbmV3IE91dHB1dFByb3BlcnRpZXNCbG9jayhtYWluKTsKLQotCQlzZXRCbG9ja3MobmV3IElMYXVuY2hDb25maWd1cmF0aW9uVGFiW10KLQkJeyBvdXRwdXRCbG9jaywgb3V0cHV0RmlsZUJsb2NrIH0pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLQl7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQkJQ29tcG9zaXRlIGNvbXAgPSAoQ29tcG9zaXRlKSBnZXRDb250cm9sKCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotCQljb21wLnNldExheW91dChsYXlvdXQpOwotCi0JCW91dHB1dEZpbGVCbG9jay5jcmVhdGVDb250cm9sKGNvbXApOwotCi0JCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKGNvbXAsIFNXVC5OVUxMKTsKLQkJZ3JvdXAuc2V0VGV4dCgiT3V0cHV0IFByb3BlcnRpZXMiKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJb3V0cHV0QmxvY2suY3JlYXRlQ29udHJvbChncm91cCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JCXJldHVybiAiT3V0cHV0IjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9wcm9jZXNzb3IvRmVhdHVyZXNCbG9jay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvcHJvY2Vzc29yL0ZlYXR1cmVzQmxvY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAyNmU4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9wcm9jZXNzb3IvRmVhdHVyZXNCbG9jay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5wcm9jZXNzb3I7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbE1vZGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLkFic3RyYWN0VGFibGVCbG9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLlhTTERlYnVnVUlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5YU0xEZWJ1Z1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkucHJlZmVyZW5jZXMuRmVhdHVyZXNQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5JRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5JUHJvY2Vzc29ySW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5JUHJvY2Vzc29yVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5YU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLlhTTFRSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmNvbmZpZy5MYXVuY2hBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuY29uZmlnLkxhdW5jaEZlYXR1cmVzOwotCi1wdWJsaWMgY2xhc3MgRmVhdHVyZXNCbG9jayBleHRlbmRzIEFic3RyYWN0VGFibGVCbG9jawotewotCXByaXZhdGUgVGFibGUgdGFibGU7Ci0JcHJpdmF0ZSBUYWJsZVZpZXdlciB0Vmlld2VyOwotCXByaXZhdGUgVGV4dCBkZXNjcmlwdGlvblRleHQ7Ci0JcHJpdmF0ZSBJUHJvY2Vzc29yVHlwZSBwcm9jZXNzb3JUeXBlOwotCXByaXZhdGUgQnV0dG9uIHVzZUZlYXR1cmVzRnJvbVByZWZlcmVuY2VzUmFkaW87Ci0JcHJpdmF0ZSBMYXVuY2hGZWF0dXJlcyBsYXVuY2hGZWF0dXJlczsKLQlwcml2YXRlIExhdW5jaEZlYXR1cmVzIGZlYXR1cmVzRnJvbVByZWZlcmVuY2VzOwotCXByaXZhdGUgQnV0dG9uIGNoYW5nZVByZWZlcmVuY2VzOwotCXByaXZhdGUgZmluYWwgTWFwPElQcm9jZXNzb3JUeXBlLCBMYXVuY2hGZWF0dXJlcz4gcHJvY2Vzc29yRmVhdHVyZXMgPSBuZXcgSGFzaE1hcDxJUHJvY2Vzc29yVHlwZSwgTGF1bmNoRmVhdHVyZXM+KCk7Ci0JcHJpdmF0ZSBCdXR0b24gdXNlU3BlY2lmaWNGZWF0dXJlc1JhZGlvOwotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElEaWFsb2dTZXR0aW5ncyBnZXREaWFsb2dTZXR0aW5ncygpCi0JewotCQlyZXR1cm4gWFNMRGVidWdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFF1YWxpZmllcigpCi0JewotCQlyZXR1cm4gWFNMRGVidWdVSUNvbnN0YW50cy5GRUFUVVJFU19MQVVOQ0hfQkxPQ0s7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFRhYmxlIGdldFRhYmxlKCkKLQl7Ci0JCXJldHVybiB0YWJsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpCi0JewotCQlGb250IGZvbnQgPSBwYXJlbnQuZ2V0Rm9udCgpOwotCi0JCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOwotCQlncm91cC5zZXRUZXh0KGdldE5hbWUoKSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0JCWdyb3VwLnNldExheW91dERhdGEoZ2QpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWdyb3VwLnNldEZvbnQoZm9udCk7Ci0KLQkJc2V0Q29udHJvbChncm91cCk7Ci0KLQkJdXNlRmVhdHVyZXNGcm9tUHJlZmVyZW5jZXNSYWRpbyA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5SQURJTyk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKFNXVC5MRUZULCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpOwotCQl1c2VGZWF0dXJlc0Zyb21QcmVmZXJlbmNlc1JhZGlvLnNldExheW91dERhdGEoZ2QpOwotCQl1c2VGZWF0dXJlc0Zyb21QcmVmZXJlbmNlc1JhZGlvLnNldFRleHQoIlVzZSBmZWF0dXJlcyBmcm9tIHByZWZlcmVuY2VzIik7Ci0JCXVzZUZlYXR1cmVzRnJvbVByZWZlcmVuY2VzUmFkaW8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkKLQkJewotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLQkJCXsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLQkJCXsKLQkJCQloYW5kbGVVc2VGZWF0dXJlc0Zyb21QcmVmZXJlbmNlcyh0cnVlKTsKLQkJCQl1cGRhdGVMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWNoYW5nZVByZWZlcmVuY2VzID0gbmV3IEJ1dHRvbihncm91cCwgU1dULlBVU0gpOwotCQljaGFuZ2VQcmVmZXJlbmNlcy5zZXRUZXh0KCJDaGFuZ2UgUHJlZmVyZW5jZXMuLi4iKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoU1dULlJJR0hULCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpOwotCQljaGFuZ2VQcmVmZXJlbmNlcy5zZXRMYXlvdXREYXRhKGdkKTsKLQkJY2hhbmdlUHJlZmVyZW5jZXMuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0JCQl7Ci0JCQkJSVByZWZlcmVuY2VQYWdlIHBhZ2UgPSBuZXcgRmVhdHVyZXNQcmVmZXJlbmNlUGFnZSgpOwotCQkJCVhTTERlYnVnVUlQbHVnaW4uc2hvd1ByZWZlcmVuY2VQYWdlKCJvcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpLnBhZ2UxIiwgcGFnZSk7Ci0JCQkJLy8gbm93IHJlZnJlc2ggZXZlcnl0aGluZwotCQkJCWhhbmRsZVVzZUZlYXR1cmVzRnJvbVByZWZlcmVuY2VzKHRydWUpOwotCQkJCS8vIHRWaWV3ZXIucmVmcmVzaCgpOwotCQkJfQotCQl9KTsKLQotCQl1c2VTcGVjaWZpY0ZlYXR1cmVzUmFkaW8gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUkFESU8pOwotCQlnZCA9IG5ldyBHcmlkRGF0YShTV1QuTEVGVCwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKTsKLQkJdXNlU3BlY2lmaWNGZWF0dXJlc1JhZGlvLnNldExheW91dERhdGEoZ2QpOwotCQl1c2VTcGVjaWZpY0ZlYXR1cmVzUmFkaW8uc2V0VGV4dCgiVXNlIHNwZWNpZmljIGZlYXR1cmVzIik7Ci0JCXVzZVNwZWNpZmljRmVhdHVyZXNSYWRpby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKQotCQl7Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotCQkJewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotCQkJewotCQkJCWhhbmRsZVVzZUZlYXR1cmVzRnJvbVByZWZlcmVuY2VzKGZhbHNlKTsKLQkJCQl1cGRhdGVMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIGZpbGxlcgotCQluZXcgTGFiZWwoZ3JvdXAsIFNXVC5OT05FKTsKLQotCQl0YWJsZSA9IG5ldyBUYWJsZShncm91cCwgU1dULkJPUkRFUiB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5WX1NDUk9MTCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0JCWdkLndpZHRoSGludCA9IDQ1MDsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQl0YWJsZS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCi0JCVRhYmxlQ29sdW1uIGMxID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWMxLnNldFdpZHRoKDE1MCk7Ci0JCWMxLnNldFJlc2l6YWJsZSh0cnVlKTsKLQkJYzEuc2V0VGV4dCgiRmVhdHVyZSIpOwotCi0JCVRhYmxlQ29sdW1uIGMyID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWMyLnNldFdpZHRoKDUwKTsKLQkJYzIuc2V0UmVzaXphYmxlKHRydWUpOwotCQljMi5zZXRUZXh0KCJUeXBlIik7Ci0KLQkJVGFibGVDb2x1bW4gYzMgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJYzMuc2V0V2lkdGgoMjUwKTsKLQkJYzMuc2V0UmVzaXphYmxlKHRydWUpOwotCQljMy5zZXRUZXh0KCJWYWx1ZSIpOwotCi0JCXRWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIodGFibGUpOwotCQl0Vmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIoKQotCQl7Ci0KLQkJCXByaXZhdGUgU2V0PD8+IHR5cGVkRmVhdHVyZXM7Ci0KLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KQotCQkJewotCQkJCXJldHVybiB0eXBlZEZlYXR1cmVzLnRvQXJyYXkobmV3IExhdW5jaEF0dHJpYnV0ZVswXSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotCQkJewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpCi0JCQl7Ci0JCQkJdHlwZWRGZWF0dXJlcyA9IChTZXQ8Pz4pIG5ld0lucHV0OwotCQkJfQotCQl9KTsKLQkJdFZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBJVGFibGVMYWJlbFByb3ZpZGVyKCkKLQkJewotCi0JCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkKLQkJCXsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpCi0JCQl7Ci0JCQkJTGF1bmNoQXR0cmlidXRlIHR2ID0gKExhdW5jaEF0dHJpYnV0ZSkgZWxlbWVudDsKLQkJCQlzd2l0Y2ggKGNvbHVtbkluZGV4KQotCQkJCXsKLQkJCQkJY2FzZSAwOgotCQkJCQkJcmV0dXJuIHJlbW92ZVVSSSh0di51cmkpOwotCQkJCQljYXNlIDE6Ci0JCQkJCQlyZXR1cm4gdHYudHlwZTsKLQkJCQkJY2FzZSAyOgotCQkJCQkJU3RyaW5nIHZhbHVlID0gdHYudmFsdWU7Ci0JCQkJCQlyZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICIiIDogdmFsdWU7Ci0JCQkJfQotCQkJCXJldHVybiAiISEiOwotCQkJfQotCi0JCQlwcml2YXRlIFN0cmluZyByZW1vdmVVUkkoU3RyaW5nIHVyaSkKLQkJCXsKLQkJCQlpbnQgaW5kZXggPSB1cmkubGFzdEluZGV4T2YoJy8nKTsKLQkJCQlpZiAoaW5kZXggPiAwKQotCQkJCQlyZXR1cm4gdXJpLnN1YnN0cmluZyhpbmRleCArIDEpOwotCQkJCXJldHVybiB1cmk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpCi0JCQl7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotCQkJewotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkKLQkJCXsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpCi0JCQl7Ci0JCQl9Ci0KLQkJfSk7Ci0JCXRWaWV3ZXIuc2V0Q29sdW1uUHJvcGVydGllcyhuZXcgU3RyaW5nW10KLQkJeyAibmFtZSIsICJ0eXBlIiwgInZhbHVlIiB9KTsKLQkJdFZpZXdlci5zZXRDZWxsTW9kaWZpZXIobmV3IElDZWxsTW9kaWZpZXIoKQotCQl7Ci0JCQlwdWJsaWMgYm9vbGVhbiBjYW5Nb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkKLQkJCXsKLQkJCQlyZXR1cm4gInZhbHVlIi5lcXVhbHMocHJvcGVydHkpOwotCQkJfQotCi0JCQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpCi0JCQl7Ci0JCQkJTGF1bmNoQXR0cmlidXRlIHR2ID0gKExhdW5jaEF0dHJpYnV0ZSkgZWxlbWVudDsKLQkJCQlyZXR1cm4gdHYudmFsdWUgPT0gbnVsbCA/ICIiIDogdHYudmFsdWU7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgdmFsdWUpCi0JCQl7Ci0JCQkJSXRlbSBpdGVtID0gKEl0ZW0pIGVsZW1lbnQ7Ci0JCQkJTGF1bmNoQXR0cmlidXRlIHR2ID0gKExhdW5jaEF0dHJpYnV0ZSkgaXRlbS5nZXREYXRhKCk7Ci0JCQkJaWYgKHZhbHVlID09IG51bGwgfHwgIiIuZXF1YWxzKHZhbHVlKSkKLQkJCQkJbGF1bmNoRmVhdHVyZXMucmVtb3ZlRmVhdHVyZSh0di51cmkpOwotCQkJCWVsc2UKLQkJCQkJdHYuc2V0VmFsdWUoKFN0cmluZykgdmFsdWUpOwotCQkJCXRWaWV3ZXIudXBkYXRlKHR2LCBudWxsKTsKLQkJCQl1cGRhdGVMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKCk7Ci0JCQl9Ci0JCX0pOwotCQl0Vmlld2VyLnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpCi0JCQl7Ci0JCQkJTGF1bmNoQXR0cmlidXRlIGExID0gKExhdW5jaEF0dHJpYnV0ZSkgZTE7Ci0JCQkJTGF1bmNoQXR0cmlidXRlIGEyID0gKExhdW5jaEF0dHJpYnV0ZSkgZTI7Ci0JCQkJcmV0dXJuIGExLnVyaS5jb21wYXJlVG8oYTIudXJpKTsKLQkJCX0KLQkJfSk7Ci0KLQkJVGV4dENlbGxFZGl0b3IgZWRpdG9yID0gbmV3IFRleHRDZWxsRWRpdG9yKHRhYmxlKTsKLQkJZWRpdG9yLnNldFZhbGlkYXRvcihuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKQotCQl7Ci0KLQkJCS8vIFRPRE8gc29ydCBvdXQKLQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChPYmplY3QgdmFsdWUpCi0JCQl7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQkJLy8gSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0KLQkJCQkvLyAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pdFZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJCQkvLyBUeXBlZFZhbHVlIHR2ID0gKFR5cGVkVmFsdWUpc2VsLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCS8vCQkJCi0JCQkJLy8gSUZlYXR1cmUgZmVhdHVyZSA9IG51bGw7Ci0JCQkJLy8gSUZlYXR1cmVbXSBmZWF0dXJlcyA9IHByb2Nlc3NvclR5cGUuZ2V0RmVhdHVyZXMoKTsKLQkJCQkvLyBmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKQotCQkJCS8vIHsKLQkJCQkvLyBJRmVhdHVyZSBmID0gZmVhdHVyZXNbaV07Ci0JCQkJLy8gaWYgKGYuZ2V0VVJJKCkuZXF1YWxzKGtleSkpCi0JCQkJLy8gewotCQkJCS8vIGZlYXR1cmUgPSBmOwotCQkJCS8vIGJyZWFrOwotCQkJCS8vIH0KLQkJCQkvLyB9Ci0JCQkJLy8gU3RyaW5nIHZhbGlkID0gbnVsbDsKLQkJCQkvLyBJU3RhdHVzIHZhbGlkU3RhdHVzID0gZmVhdHVyZS52YWxpZGF0ZVZhbHVlKChTdHJpbmcpdmFsdWUpOwotCQkJCS8vIGlmICh2YWxpZFN0YXR1cyAhPSBudWxsICYmIHZhbGlkU3RhdHVzLmdldFNldmVyaXR5KCkgPT0KLQkJCQkvLyBJU3RhdHVzLkVSUk9SKQotCQkJCS8vIHsKLQkJCQkvLyB2YWxpZCA9IHZhbGlkU3RhdHVzLmdldE1lc3NhZ2UoKTsKLQkJCQkvLyB9Ci0JCQkJLy8gcmV0dXJuIHZhbGlkOwotCQkJfQotCQl9KTsKLQotCQlDZWxsRWRpdG9yW10gZWRpdG9ycyA9IG5ldyBDZWxsRWRpdG9yW10KLQkJeyBudWxsLCBudWxsLCBlZGl0b3IgfTsKLQkJdFZpZXdlci5zZXRDZWxsRWRpdG9ycyhlZGl0b3JzKTsKLQkJdFZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKQotCQl7Ci0KLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KQotCQkJewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJTGF1bmNoQXR0cmlidXRlIHR2ID0gKExhdW5jaEF0dHJpYnV0ZSkgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJCQlpZiAodHYgIT0gbnVsbCkKLQkJCQl7Ci0JCQkJCUlGZWF0dXJlIGZlYXR1cmUgPSBudWxsOwotCQkJCQlJRmVhdHVyZVtdIGZlYXR1cmVzID0gcHJvY2Vzc29yVHlwZS5nZXRGZWF0dXJlcygpOwotCQkJCQlmb3IgKElGZWF0dXJlIGYgOiBmZWF0dXJlcykKLQkJCQkJewotCQkJCQkJaWYgKGYuZ2V0VVJJKCkuZXF1YWxzKHR2LnVyaSkpCi0JCQkJCQl7Ci0JCQkJCQkJZmVhdHVyZSA9IGY7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJdGV4dCA9IGZlYXR1cmUgPT0gbnVsbCA/IG51bGwgOiBmZWF0dXJlLmdldERlc2NyaXB0aW9uKCk7Ci0JCQkJfQotCQkJCWRlc2NyaXB0aW9uVGV4dC5zZXRUZXh0KHRleHQgPT0gbnVsbCA/ICIiIDogdGV4dCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWRlc2NyaXB0aW9uVGV4dCA9IG5ldyBUZXh0KGdyb3VwLCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSB8IFNXVC5WX1NDUk9MTCB8IFNXVC5XUkFQKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5OT05FLCB0cnVlLCBmYWxzZSk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJZ2QuaGVpZ2h0SGludCA9IDUwOwotCQlkZXNjcmlwdGlvblRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJcmVzdG9yZUNvbHVtblNldHRpbmdzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVVzZUZlYXR1cmVzRnJvbVByZWZlcmVuY2VzKGJvb2xlYW4gc2VsZWN0ZWQpCi0JewotCQljaGFuZ2VQcmVmZXJlbmNlcy5zZXRFbmFibGVkKHNlbGVjdGVkKTsKLQkJdGFibGUuc2V0RW5hYmxlZCghc2VsZWN0ZWQpOwotCi0JCWlmIChzZWxlY3RlZCkKLQkJewotCQkJbGF1bmNoRmVhdHVyZXMgPSBpbml0aWFsaXplRmVhdHVyZXNGcm9tUHJlZmVyZW5jZXMoKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWxhdW5jaEZlYXR1cmVzID0gKExhdW5jaEZlYXR1cmVzKSBwcm9jZXNzb3JGZWF0dXJlcy5nZXQocHJvY2Vzc29yVHlwZSk7Ci0KLQkJCWlmIChsYXVuY2hGZWF0dXJlcyA9PSBudWxsKQotCQkJey8vIG1ha2UgYSBjb3B5IG9mIHRoZSBmZWF0dXJlcyBmb3IgdGhlIHByb2Nlc3NvciB0eXBlCi0JCQkJbGF1bmNoRmVhdHVyZXMgPSBuZXcgTGF1bmNoRmVhdHVyZXMoKTsKLQkJCQlwcm9jZXNzb3JGZWF0dXJlcy5wdXQocHJvY2Vzc29yVHlwZSwgbGF1bmNoRmVhdHVyZXMpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvY2Vzc29yVHlwZS5nZXRGZWF0dXJlcygpLmxlbmd0aDsgaSsrKQotCQkJCXsKLQkJCQkJSUZlYXR1cmUgZmVhdHVyZSA9IHByb2Nlc3NvclR5cGUuZ2V0RmVhdHVyZXMoKVtpXTsKLQkJCQkJTGF1bmNoQXR0cmlidXRlIGF0dCA9IG5ldyBMYXVuY2hBdHRyaWJ1dGUoZmVhdHVyZS5nZXRVUkkoKSwgZmVhdHVyZS5nZXRUeXBlKCksIG51bGwpOwotCQkJCQlsYXVuY2hGZWF0dXJlcy5hZGRGZWF0dXJlKGF0dCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXRWaWV3ZXIuc2V0SW5wdXQobGF1bmNoRmVhdHVyZXMuZ2V0RmVhdHVyZXMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHJvY2Vzc29yVHlwZShJUHJvY2Vzc29yVHlwZSBwcm9jZXNzb3JUeXBlKQotCXsKLQkJaWYgKHByb2Nlc3NvclR5cGUgPT0gdGhpcy5wcm9jZXNzb3JUeXBlKQotCQkJcmV0dXJuOwotCi0JCS8vIHRoaXMuZmVhdHVyZXNGcm9tUHJlZmVyZW5jZXMgPSBuZXcgTGF1bmNoRmVhdHVyZXMoKTsKLQkJLy8gSUZlYXR1cmVbXSBmZWF0dXJlcyA9IHByb2Nlc3NvclR5cGUuZ2V0RmVhdHVyZXMoKTsKLQkJLy8gTWFwIHZhbHVlcyA9IHByb2Nlc3NvclR5cGUuZ2V0RmVhdHVyZVZhbHVlcygpOwotCQkvLyBmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKQotCQkvLyB7Ci0JCS8vIElGZWF0dXJlIGZlYXR1cmUgPSBmZWF0dXJlc1tpXTsKLQkJLy8gZmVhdHVyZXNGcm9tUHJlZmVyZW5jZXMuYWRkRmVhdHVyZShuZXcKLQkJLy8gTGF1bmNoQXR0cmlidXRlKGZlYXR1cmUuZ2V0VVJJKCksZmVhdHVyZS5nZXRUeXBlKCksKFN0cmluZyl2YWx1ZXMuZ2V0KGZlYXR1cmUuZ2V0VVJJKCkpKSk7Ci0JCS8vIH0KLQkJLy8KLQkJLy8gaWYgKHRhYmxlICE9IG51bGwpCi0JCS8vIHsKLQkJLy8gaWYgKCF0YWJsZS5nZXRFbmFibGVkKCkpCi0JCS8vIHsKLQkJLy8gbGF1bmNoRmVhdHVyZXMgPSBmZWF0dXJlc0Zyb21QcmVmZXJlbmNlczsKLQkJLy8gfQotCQkvLyBlbHNlCi0JCS8vIHsKLQkJLy8gdGhpcy5sYXVuY2hGZWF0dXJlcyA9IG5ldyBMYXVuY2hGZWF0dXJlcygpOwotCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPQotCQkvLyBmZWF0dXJlc0Zyb21QcmVmZXJlbmNlcy5nZXRGZWF0dXJlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLQkJLy8gewotCQkvLyBMYXVuY2hBdHRyaWJ1dGUgYXR0ID0gKExhdW5jaEF0dHJpYnV0ZSkgaXRlci5uZXh0KCk7Ci0JCS8vIGF0dCA9IG5ldyBMYXVuY2hBdHRyaWJ1dGUoYXR0LnVyaSxhdHQudHlwZSxhdHQudmFsdWUpOwotCQkvLyBsYXVuY2hGZWF0dXJlcy5hZGRGZWF0dXJlKGF0dCk7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyB0Vmlld2VyLnNldElucHV0KGxhdW5jaEZlYXR1cmVzLmdldEZlYXR1cmVzKCkpOwotCQkvLyB9Ci0JCXRoaXMucHJvY2Vzc29yVHlwZSA9IHByb2Nlc3NvclR5cGU7Ci0JCWhhbmRsZVVzZUZlYXR1cmVzRnJvbVByZWZlcmVuY2VzKHVzZUZlYXR1cmVzRnJvbVByZWZlcmVuY2VzUmFkaW8uZ2V0U2VsZWN0aW9uKCkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCQlyZXR1cm4gIlByb2Nlc3NvciBGZWF0dXJlcyI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdHMoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uKQotCXsKLQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1VTRV9GRUFUVVJFU19GUk9NX1BSRUZFUkVOQ0VTLCB0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIExhdW5jaEZlYXR1cmVzIGluaXRpYWxpemVGZWF0dXJlc0Zyb21QcmVmZXJlbmNlcygpCi0JewotCQlMYXVuY2hGZWF0dXJlcyBmZWF0dXJlc0Zyb21QcmVmZXJlbmNlcyA9IG5ldyBMYXVuY2hGZWF0dXJlcygpOwotCi0JCUlGZWF0dXJlW10gZmVhdHVyZXMgPSBwcm9jZXNzb3JUeXBlLmdldEZlYXR1cmVzKCk7Ci0JCU1hcDw/LCA/PiB2YWx1ZXMgPSBwcm9jZXNzb3JUeXBlLmdldEZlYXR1cmVWYWx1ZXMoKTsKLQkJZm9yIChJRmVhdHVyZSBmZWF0dXJlIDogZmVhdHVyZXMpCi0JCXsKLQkJCWZlYXR1cmVzRnJvbVByZWZlcmVuY2VzLmFkZEZlYXR1cmUobmV3IExhdW5jaEF0dHJpYnV0ZShmZWF0dXJlLmdldFVSSSgpLCBmZWF0dXJlLmdldFR5cGUoKSwgKFN0cmluZykgdmFsdWVzLmdldChmZWF0dXJlLmdldFVSSSgpKSkpOwotCQl9Ci0JCXJldHVybiBmZWF0dXJlc0Zyb21QcmVmZXJlbmNlczsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUZlYXR1cmVzRnJvbVN0b3JhZ2UoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCUxhdW5jaEZlYXR1cmVzIGxhdW5jaEZlYXR1cmVzID0gbmV3IExhdW5jaEZlYXR1cmVzKCk7Ci0KLQkJSUZlYXR1cmVbXSBmZWF0dXJlcyA9IHByb2Nlc3NvclR5cGUuZ2V0RmVhdHVyZXMoKTsKLQkJZm9yIChJRmVhdHVyZSBmZWF0dXJlIDogZmVhdHVyZXMpCi0JCXsKLQkJCWxhdW5jaEZlYXR1cmVzLmFkZEZlYXR1cmUobmV3IExhdW5jaEF0dHJpYnV0ZShmZWF0dXJlLmdldFVSSSgpLCBmZWF0dXJlLmdldFR5cGUoKSwgbnVsbCkpOwotCQl9Ci0KLQkJU3RyaW5nIHMgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfRkVBVFVSRVMsIChTdHJpbmcpIG51bGwpOwotCQlpZiAocyAhPSBudWxsICYmIHMubGVuZ3RoKCkgPiAwKQotCQl7Ci0JCQlMYXVuY2hGZWF0dXJlcyBvdmVycmlkZUZlYXR1cmVzID0gTGF1bmNoRmVhdHVyZXMuZnJvbVhNTChuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocy5nZXRCeXRlcygpKSk7Ci0JCQlsYXVuY2hGZWF0dXJlcy5nZXRGZWF0dXJlcygpLnJlbW92ZUFsbChvdmVycmlkZUZlYXR1cmVzLmdldEZlYXR1cmVzKCkpOwotCQkJbGF1bmNoRmVhdHVyZXMuZ2V0RmVhdHVyZXMoKS5hZGRBbGwob3ZlcnJpZGVGZWF0dXJlcy5nZXRGZWF0dXJlcygpKTsKLQkJfQotCi0JCXByb2Nlc3NvckZlYXR1cmVzLnB1dChwcm9jZXNzb3JUeXBlLCBsYXVuY2hGZWF0dXJlcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikKLQl7Ci0JCXRyeQotCQl7Ci0JCQlTdHJpbmcgcHJvY2Vzc29ySWQgPSBudWxsOwotCQkJYm9vbGVhbiB1c2VEZWZhdWx0UHJvY2Vzc29yID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1VTRV9ERUZBVUxUX1BST0NFU1NPUiwgdHJ1ZSk7Ci0JCQlpZiAodXNlRGVmYXVsdFByb2Nlc3NvcikKLQkJCQlwcm9jZXNzb3JJZCA9IFhTTFRSdW50aW1lLmdldERlZmF1bHRQcm9jZXNzb3IoKS5nZXRJZCgpOwotCQkJZWxzZQotCQkJCXByb2Nlc3NvcklkID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BST0NFU1NPUiwgWFNMVFJ1bnRpbWUuSlJFX0RFRkFVTFRfUFJPQ0VTU09SX0lEKTsKLQotCQkJSVByb2Nlc3Nvckluc3RhbGwgcHJvY2Vzc29yID0gWFNMVFJ1bnRpbWUuZ2V0UHJvY2Vzc29yKHByb2Nlc3NvcklkKTsKLQkJCWlmIChwcm9jZXNzb3IgIT0gbnVsbCkKLQkJCQlwcm9jZXNzb3JUeXBlID0gcHJvY2Vzc29yLmdldFByb2Nlc3NvclR5cGUoKTsKLQkJCWVsc2UKLQkJCQlwcm9jZXNzb3JUeXBlID0gWFNMVFJ1bnRpbWUuZ2V0RGVmYXVsdFByb2Nlc3NvcigpLmdldFByb2Nlc3NvclR5cGUoKTsKLQotCQkJZmVhdHVyZXNGcm9tUHJlZmVyZW5jZXMgPSBpbml0aWFsaXplRmVhdHVyZXNGcm9tUHJlZmVyZW5jZXMoKTsKLQkJCWluaXRpYWxpemVGZWF0dXJlc0Zyb21TdG9yYWdlKGNvbmZpZ3VyYXRpb24pOwotCi0JCQlib29sZWFuIHVzZUZlYXR1cmVzRnJvbVByZWZlcmVuY2VzID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1VTRV9GRUFUVVJFU19GUk9NX1BSRUZFUkVOQ0VTLCB0cnVlKTsKLQotCQkJdXNlU3BlY2lmaWNGZWF0dXJlc1JhZGlvLnNldFNlbGVjdGlvbighdXNlRmVhdHVyZXNGcm9tUHJlZmVyZW5jZXMpOwotCQkJdXNlRmVhdHVyZXNGcm9tUHJlZmVyZW5jZXNSYWRpby5zZXRTZWxlY3Rpb24odXNlRmVhdHVyZXNGcm9tUHJlZmVyZW5jZXMpOwotCQkJaGFuZGxlVXNlRmVhdHVyZXNGcm9tUHJlZmVyZW5jZXModXNlRmVhdHVyZXNGcm9tUHJlZmVyZW5jZXMpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0JCXsKLQkJCVhTTERlYnVnVUlQbHVnaW4ubG9nKGUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybUFwcGx5KElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlndXJhdGlvbikKLQl7Ci0JCWJvb2xlYW4gdXNlRGVmYXVsdCA9IHVzZUZlYXR1cmVzRnJvbVByZWZlcmVuY2VzUmFkaW8uZ2V0U2VsZWN0aW9uKCk7Ci0JCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9VU0VfRkVBVFVSRVNfRlJPTV9QUkVGRVJFTkNFUywgdXNlRGVmYXVsdCk7Ci0JCXRyeQotCQl7Ci0JCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfRkVBVFVSRVMsIHVzZURlZmF1bHQgPyBudWxsIDogbGF1bmNoRmVhdHVyZXMudG9YTUwoKSk7Ci0JCX0KLQkJY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkKLQkJewotCQkJWFNMRGVidWdVSVBsdWdpbi5sb2coZSk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0JCXsKLQkJCVhTTERlYnVnVUlQbHVnaW4ubG9nKGUpOwotCQl9Ci0JCWNhdGNoIChUcmFuc2Zvcm1lckV4Y2VwdGlvbiBlKQotCQl7Ci0JCQlYU0xEZWJ1Z1VJUGx1Z2luLmxvZyhlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL3Byb2Nlc3Nvci9JbnN0YWxsU3RhbmRpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvcHJvY2Vzc29yL0luc3RhbGxTdGFuZGluLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ZDY3YjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvcHJvY2Vzc29yL0luc3RhbGxTdGFuZGluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMucHJvY2Vzc29yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuSVByb2Nlc3Nvckluc3RhbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuSVByb2Nlc3NvckphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5Qcm9jZXNzb3JJbnN0YWxsOwotCi1wdWJsaWMgY2xhc3MgSW5zdGFsbFN0YW5kaW4gZXh0ZW5kcyBQcm9jZXNzb3JJbnN0YWxsCi17Ci0JcHVibGljIEluc3RhbGxTdGFuZGluKElQcm9jZXNzb3JJbnN0YWxsIGluc3RhbGwpCi0JewotCQlzdXBlcihpbnN0YWxsLmdldElkKCksIGluc3RhbGwuZ2V0TmFtZSgpLCBpbnN0YWxsLmdldFByb2Nlc3NvclR5cGUoKS5nZXRJZCgpLCBpbnN0YWxsLmdldFByb2Nlc3NvckphcnMoKSwgaW5zdGFsbC5nZXREZWJ1Z2dlcigpICE9IG51bGwgPyBpbnN0YWxsLmdldERlYnVnZ2VyKCkuZ2V0SWQoKSA6IG51bGwsIGluc3RhbGwKLQkJCQkuZ2V0U3VwcG9ydHMoKSwgaW5zdGFsbC5pc0NvbnRyaWJ1dGVkKCkpOwotCX0KLQotCXB1YmxpYyBJbnN0YWxsU3RhbmRpbihTdHJpbmcgaWQsIFN0cmluZyBuYW1lLCBTdHJpbmcgdHlwZUlkLCBTdHJpbmcgZGVidWdnZXJJZCwgSVByb2Nlc3NvckphcltdIGphcnMpCi0JewotCQlzdXBlcihpZCwgbmFtZSwgdHlwZUlkLCBqYXJzLCBkZWJ1Z2dlcklkLCAiIiwgZmFsc2UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL3Byb2Nlc3Nvci9KYXJDb250ZW50UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL3Byb2Nlc3Nvci9KYXJDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNhMWRlOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9wcm9jZXNzb3IvSmFyQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMucHJvY2Vzc29yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5JUHJvY2Vzc29ySW5zdGFsbDsKLQotcHVibGljIGNsYXNzIEphckNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyCi17Ci0JcHJpdmF0ZSBJUHJvY2Vzc29ySW5zdGFsbCBpbnN0YWxsOwotCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpCi0JewotCQlyZXR1cm4gaW5zdGFsbC5nZXRQcm9jZXNzb3JKYXJzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpCi0JewotCX0KLQotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkKLQl7Ci0JCWluc3RhbGwgPSAoSVByb2Nlc3Nvckluc3RhbGwpIG5ld0lucHV0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL3Byb2Nlc3Nvci9KYXJMYWJlbFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9wcm9jZXNzb3IvSmFyTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmRhYjM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL3Byb2Nlc3Nvci9KYXJMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMucHJvY2Vzc29yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5JUHJvY2Vzc29ySmFyOwotCi1wdWJsaWMgY2xhc3MgSmFyTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIKLXsKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpCi0JewotCQlJUHJvY2Vzc29ySmFyIGphciA9IChJUHJvY2Vzc29ySmFyKSBlbGVtZW50OwotCQlJUGF0aCBwYXRoID0gamFyLmdldFBhdGgoKTsKLQkJcmV0dXJuIHBhdGgubGFzdFNlZ21lbnQoKSArICIgLSAiICsgcGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSkudG9PU1N0cmluZygpICsgIiI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvcHJvY2Vzc29yL1Byb2Nlc3NvckJsb2NrLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9wcm9jZXNzb3IvUHJvY2Vzc29yQmxvY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk5ZmZkMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9wcm9jZXNzb3IvUHJvY2Vzc29yQmxvY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMucHJvY2Vzc29yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuQWJzdHJhY3RMYXVuY2hDb25maWd1cmF0aW9uVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLlhTTERlYnVnVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5wcmVmZXJlbmNlcy5Qcm9jZXNzb3JzUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuSVByb2Nlc3Nvckluc3RhbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5YU0xUUnVudGltZTsKLQotcHVibGljIGNsYXNzIFByb2Nlc3NvckJsb2NrIGV4dGVuZHMgQWJzdHJhY3RMYXVuY2hDb25maWd1cmF0aW9uVGFiCi17Ci0JcHJpdmF0ZSBCdXR0b24gdXNlUHJlZmVyZW5jZXNSYWRpbzsKLQlwcml2YXRlIEJ1dHRvbiBhbHRlclByZWZlcmVuY2VzQnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIG92ZXJyaWRlUHJlZmVyZW5jZXNSYWRpbzsKLQlwcml2YXRlIENvbWJvIHJ1bkNvbWJvOwotCXByaXZhdGUgQnV0dG9uIGluc3RhbGxlZFByb2Nlc3NvcnNCdXR0b247Ci0JcHJpdmF0ZSBDb21ib1ZpZXdlciBydW5Db21ib1ZpZXdlcjsKLQlwcml2YXRlIGZpbmFsIEZlYXR1cmVzQmxvY2sgZmVhdHVyZXNCbG9jazsKLQotCXB1YmxpYyBQcm9jZXNzb3JCbG9jayhGZWF0dXJlc0Jsb2NrIGZlYXR1cmVzQmxvY2spCi0JewotCQl0aGlzLmZlYXR1cmVzQmxvY2sgPSBmZWF0dXJlc0Jsb2NrOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLQl7Ci0JCUZvbnQgZm9udCA9IHBhcmVudC5nZXRGb250KCk7Ci0KLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTlVMTCk7Ci0JCXNldENvbnRyb2woZ3JvdXApOwotCQlncm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWdyb3VwLnNldEZvbnQoZm9udCk7Ci0JCWdyb3VwLnNldFRleHQoIlhTTFQgUHJvY2Vzc29yIik7Ci0KLQkJdXNlUHJlZmVyZW5jZXNSYWRpbyA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5SQURJTyk7Ci0JCXVzZVByZWZlcmVuY2VzUmFkaW8uc2V0VGV4dCgiVXNlIHByb2Nlc3NvciBmcm9tIHByZWZlcmVuY2VzIik7Ci0JCXVzZVByZWZlcmVuY2VzUmFkaW8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0JCQl7Ci0JCQkJcHJlZmVyZW5jZXNTZWxlY3RlZCgpOwotCQkJCXVwZGF0ZUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coKTsKLQkJCX0KLQkJfSk7Ci0KLQkJYWx0ZXJQcmVmZXJlbmNlc0J1dHRvbiA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5QVVNIKTsKLQkJYWx0ZXJQcmVmZXJlbmNlc0J1dHRvbi5zZXRUZXh0KCJDaGFuZ2UgcHJlZmVyZW5jZXMuLi4iKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpOwotCQlnZC53aWR0aEhpbnQgPSAxNTA7Ci0JCWFsdGVyUHJlZmVyZW5jZXNCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWFsdGVyUHJlZmVyZW5jZXNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0JCQl7Ci0JCQkJSVByZWZlcmVuY2VQYWdlIHBhZ2UgPSBuZXcgUHJvY2Vzc29yc1ByZWZlcmVuY2VQYWdlKCk7Ci0JCQkJc2hvd1ByZWZQYWdlKCJvcmcuZWNsaXBzZS53c3QueHNsdC5sYXVuY2hpbmcudWkucHJlZmVyZW5jZXMuUHJvY2Vzc29yUHJlZmVyZW5jZVBhZ2UiLCBwYWdlKTsKLQkJCX0KLQkJfSk7Ci0KLQkJb3ZlcnJpZGVQcmVmZXJlbmNlc1JhZGlvID0gbmV3IEJ1dHRvbihncm91cCwgU1dULlJBRElPKTsKLQkJb3ZlcnJpZGVQcmVmZXJlbmNlc1JhZGlvLnNldFRleHQoIlVzZSBzcGVjaWZpYyBwcm9jZXNzb3IiKTsKLQkJb3ZlcnJpZGVQcmVmZXJlbmNlc1JhZGlvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotCQkJewotCQkJCW92ZXJyaWRlU2VsZWN0ZWQoKTsKLQkJCQl1cGRhdGVMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWluc3RhbGxlZFByb2Nlc3NvcnNCdXR0b24gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUFVTSCk7Ci0JCWluc3RhbGxlZFByb2Nlc3NvcnNCdXR0b24uc2V0VGV4dChQcm9jZXNzb3JNZXNzYWdlcy5Qcm9jZXNzb3JzQ29tYm9CbG9ja18xKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpOwotCQlnZC53aWR0aEhpbnQgPSAxNTA7Ci0JCWluc3RhbGxlZFByb2Nlc3NvcnNCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWluc3RhbGxlZFByb2Nlc3NvcnNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0JCQl7Ci0JCQkJSVByZWZlcmVuY2VQYWdlIHBhZ2UgPSBuZXcgUHJvY2Vzc29yc1ByZWZlcmVuY2VQYWdlKCk7Ci0JCQkJc2hvd1ByZWZQYWdlKCJvcmcuZWNsaXBzZS53c3QueHNsdC5sYXVuY2hpbmcudWkucHJlZmVyZW5jZXMuUHJvY2Vzc29yUHJlZmVyZW5jZVBhZ2UiLCBwYWdlKTsKLQkJCX0KLQkJfSk7Ci0KLQkJQ29tcG9zaXRlIHNldHRpbmdzQ29tcCA9IG5ldyBDb21wb3NpdGUoZ3JvdXAsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBnbCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJZ2wubWFyZ2luSGVpZ2h0ID0gMjsKLQkJc2V0dGluZ3NDb21wLnNldExheW91dChnbCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxJbmRlbnQgPSAxNTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlzZXR0aW5nc0NvbXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXNldHRpbmdzQ29tcC5zZXRGb250KGZvbnQpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHNldHRpbmdzQ29tcCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KCJQcm9jZXNzb3I6Iik7Ci0JCXJ1bkNvbWJvID0gbmV3IENvbWJvKHNldHRpbmdzQ29tcCwgU1dULlJFQURfT05MWSB8IFNXVC5TSU5HTEUpOwotCQlydW5Db21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJcnVuQ29tYm9WaWV3ZXIgPSBuZXcgQ29tYm9WaWV3ZXIocnVuQ29tYm8pOwotCQlydW5Db21ib1ZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IENvbWJvQ29udGVudFByb3ZpZGVyKCkpOwotCQlydW5Db21ib1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBDb21ib0xhYmVsUHJvdmlkZXIoKSk7Ci0JCXJ1bkNvbWJvVmlld2VyLnNldElucHV0KFhTTFRSdW50aW1lLmdldFByb2Nlc3NvcnMoKSk7Ci0JCXJ1bkNvbWJvVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpCi0JCXsKLQotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0JCQl7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoIXNlbC5pc0VtcHR5KCkpCi0JCQkJewotCQkJCQlJUHJvY2Vzc29ySW5zdGFsbCBwcm9jZXNzb3IgPSAoSVByb2Nlc3Nvckluc3RhbGwpIHNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJZmVhdHVyZXNCbG9jay5zZXRQcm9jZXNzb3JUeXBlKHByb2Nlc3Nvci5nZXRQcm9jZXNzb3JUeXBlKCkpOwotCQkJCX0KLQkJCQl1cGRhdGVMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmVmZXJlbmNlc1NlbGVjdGVkKCkKLQl7Ci0JCWFsdGVyUHJlZmVyZW5jZXNCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJaW5zdGFsbGVkUHJvY2Vzc29yc0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJcnVuQ29tYm8uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXJ1bkNvbWJvVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihnZXRSdW5Qcm9jZXNzb3JQcmVmZXJlbmNlKCkpLCB0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3ZlcnJpZGVTZWxlY3RlZCgpCi0JewotCQlhbHRlclByZWZlcmVuY2VzQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlpbnN0YWxsZWRQcm9jZXNzb3JzQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJ1bkNvbWJvLnNldEVuYWJsZWQodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNob3dQcmVmUGFnZShTdHJpbmcgaWQsIElQcmVmZXJlbmNlUGFnZSBwYWdlKQotCXsKLQkJWFNMRGVidWdVSVBsdWdpbi5zaG93UHJlZmVyZW5jZVBhZ2UoaWQsIHBhZ2UpOwotCQkvLyBub3cgcmVmcmVzaCBldmVyeXRoaW5nCi0JCXJ1bkNvbWJvVmlld2VyLnNldElucHV0KFhTTFRSdW50aW1lLmdldFByb2Nlc3NvcnMoKSk7Ci0JCXJ1bkNvbWJvVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihnZXRSdW5Qcm9jZXNzb3JQcmVmZXJlbmNlKCkpLCB0cnVlKTsKLQkJLy8gcHJlZmVyZW5jZXNTZWxlY3RlZCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCQlyZXR1cm4gIlByb2Nlc3NvciI7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikKLQl7Ci0JCXRyeQotCQl7Ci0JCQlib29sZWFuIHVzZURlZmF1bHRQcm9jZXNzb3IgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfVVNFX0RFRkFVTFRfUFJPQ0VTU09SLCB0cnVlKTsKLQkJCWlmICh1c2VEZWZhdWx0UHJvY2Vzc29yKQotCQkJewotCQkJCXVzZVByZWZlcmVuY2VzUmFkaW8uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCW92ZXJyaWRlUHJlZmVyZW5jZXNSYWRpby5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCXByZWZlcmVuY2VzU2VsZWN0ZWQoKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQl1c2VQcmVmZXJlbmNlc1JhZGlvLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQkJb3ZlcnJpZGVQcmVmZXJlbmNlc1JhZGlvLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQlvdmVycmlkZVNlbGVjdGVkKCk7Ci0KLQkJCQlJUHJvY2Vzc29ySW5zdGFsbCBydW5JbnN0YWxsID0gbnVsbDsKLQkJCQlTdHJpbmcgcnVuSWQgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfUFJPQ0VTU09SLCAoU3RyaW5nKSBudWxsKTsKLQkJCQlpZiAocnVuSWQgIT0gbnVsbCkKLQkJCQkJcnVuSW5zdGFsbCA9IFhTTFRSdW50aW1lLmdldFByb2Nlc3NvcihydW5JZCk7Ci0JCQkJaWYgKHJ1bkluc3RhbGwgPT0gbnVsbCkKLQkJCQkJcnVuSW5zdGFsbCA9IGdldFJ1blByb2Nlc3NvclByZWZlcmVuY2UoKTsKLQkJCQlydW5Db21ib1ZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ocnVuSW5zdGFsbCkpOwotCi0JCQkJLy8gSURlYnVnZ2VyIGRlYnVnSW5zdGFsbCA9IG51bGw7Ci0JCQkJLy8gU3RyaW5nIGRlYnVnSWQgPQotCQkJCS8vIGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QUk9DRVNTT1JfRk9SX0RFQlVHLAotCQkJCS8vIChTdHJpbmcpbnVsbCk7Ci0JCQkJLy8gaWYgKGRlYnVnSWQgIT0gbnVsbCkKLQkJCQkvLyBkZWJ1Z0luc3RhbGwgPSBYU0xUUnVudGltZS5nZXREZWJ1Z2dlcihkZWJ1Z0lkKTsKLQkJCQkvLyBpZiAoZGVidWdJbnN0YWxsID09IG51bGwpCi0JCQkJLy8gZGVidWdJbnN0YWxsID0gcnVuSW5zdGFsbC5nZXREZWJ1Z2dlcigpOwotCQkJCS8vIGlmIChkZWJ1Z0luc3RhbGwgPT0gbnVsbCkKLQkJCQkvLyBkZWJ1Z0luc3RhbGwgPSBnZXREZWJ1Z1Byb2Nlc3NvclByZWZlcmVuY2UoKTsKLQkJCQkvLyBkZWJ1Z0NvbWJvVmlld2VyLnNldFNlbGVjdGlvbihuZXcKLQkJCQkvLyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGRlYnVnSW5zdGFsbCkpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0JCXsKLQkJCVhTTERlYnVnVUlQbHVnaW4ubG9nKGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJUHJvY2Vzc29ySW5zdGFsbCBnZXRSdW5Qcm9jZXNzb3JQcmVmZXJlbmNlKCkKLQl7Ci0JCXJldHVybiBYU0xUUnVudGltZS5nZXREZWZhdWx0UHJvY2Vzc29yKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybUFwcGx5KElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlndXJhdGlvbikKLQl7Ci0JCWJvb2xlYW4gdXNlUHJlZmVyZW5jZXMgPSB1c2VQcmVmZXJlbmNlc1JhZGlvLmdldFNlbGVjdGlvbigpOwotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfVVNFX0RFRkFVTFRfUFJPQ0VTU09SLCB1c2VQcmVmZXJlbmNlcyk7Ci0JCWlmICghdXNlUHJlZmVyZW5jZXMpCi0JCXsKLQkJCUlQcm9jZXNzb3JJbnN0YWxsIHJ1bnByb2Nlc3NvciA9IChJUHJvY2Vzc29ySW5zdGFsbCkgKChJU3RydWN0dXJlZFNlbGVjdGlvbikgcnVuQ29tYm9WaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BST0NFU1NPUiwgcnVucHJvY2Vzc29yLmdldElkKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdHMoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uKQotCXsKLQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1VTRV9ERUZBVUxUX1BST0NFU1NPUiwgdHJ1ZSk7Ci0JCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QUk9DRVNTT1IsIChTdHJpbmcpIG51bGwpOwotCX0KLQotCXByaXZhdGUgY2xhc3MgQ29tYm9Db250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcgotCXsKLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpCi0JCXsKLQkJCXJldHVybiBYU0xUUnVudGltZS5nZXRQcm9jZXNzb3JzKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLQkJewotCQl9Ci0KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KQotCQl7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIENvbWJvTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIKLQl7Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpCi0JCXsKLQkJCUlQcm9jZXNzb3JJbnN0YWxsIGluc3RhbGwgPSAoSVByb2Nlc3Nvckluc3RhbGwpIGVsZW1lbnQ7Ci0JCQlyZXR1cm4gaW5zdGFsbC5nZXROYW1lKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9wcm9jZXNzb3IvUHJvY2Vzc29yRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvcHJvY2Vzc29yL1Byb2Nlc3NvckRlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhkODNmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9wcm9jZXNzb3IvUHJvY2Vzc29yRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLnByb2Nlc3NvcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFByb2Nlc3NvckRlc2NyaXB0b3IKLXsKLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvcHJvY2Vzc29yL1Byb2Nlc3NvckRldGFpbHNEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL3Byb2Nlc3Nvci9Qcm9jZXNzb3JEZXRhaWxzRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MjY1ZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvcHJvY2Vzc29yL1Byb2Nlc3NvckRldGFpbHNEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMucHJvY2Vzc29yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLlhTTERlYnVnVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuSVByb2Nlc3Nvckluc3RhbGw7Ci0KLXB1YmxpYyBjbGFzcyBQcm9jZXNzb3JEZXRhaWxzRGlhbG9nIGV4dGVuZHMgRGlhbG9nCi17Ci0JcHJpdmF0ZSBmaW5hbCBJUHJvY2Vzc29ySW5zdGFsbCBpbnN0YWxsOwotCi0JcHVibGljIFByb2Nlc3NvckRldGFpbHNEaWFsb2coU2hlbGwgc2hlbGwsIElQcm9jZXNzb3JJbnN0YWxsIGluc3RhbGwpCi0JewotCQlzdXBlcihzaGVsbCk7Ci0JCXNldFNoZWxsU3R5bGUoZ2V0U2hlbGxTdHlsZSgpIHwgU1dULlJFU0laRSk7Ci0JCXRoaXMuaW5zdGFsbCA9IGluc3RhbGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgbmV3U2hlbGwpCi0JewotCQlzdXBlci5jb25maWd1cmVTaGVsbChuZXdTaGVsbCk7Ci0JCW5ld1NoZWxsLnNldFRleHQoUHJvY2Vzc29yTWVzc2FnZXMuUHJvY2Vzc29yRGV0YWlsc0RpYWxvZ19UaXRsZSk7Ci0JCS8vIFRPRE8gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscC4uLgotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIGFuY2VzdG9yKQotCXsKLQkJQ29tcG9zaXRlIHBhcmVudCA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEoYW5jZXN0b3IpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJcGFyZW50LnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIHR5cGUKLQkJY3JlYXRlTGFiZWwocGFyZW50LCBQcm9jZXNzb3JNZXNzYWdlcy5Qcm9jZXNzb3JEZXRhaWxzRGlhbG9nX2luc3RhbGxUeXBlKTsKLQkJY3JlYXRlTGFiZWwocGFyZW50LCBpbnN0YWxsLmdldFByb2Nlc3NvclR5cGUoKS5nZXRMYWJlbCgpKTsKLQotCQkvLyBuYW1lCi0JCWNyZWF0ZUxhYmVsKHBhcmVudCwgUHJvY2Vzc29yTWVzc2FnZXMuUHJvY2Vzc29yRGV0YWlsc0RpYWxvZ19pbnN0YWxsTmFtZSk7Ci0JCWNyZWF0ZUxhYmVsKHBhcmVudCwgaW5zdGFsbC5nZXROYW1lKCkpOwotCi0JCS8vIGphcnMKLQkJTGFiZWwgbGFiZWwgPSBjcmVhdGVMYWJlbChwYXJlbnQsIFByb2Nlc3Nvck1lc3NhZ2VzLlByb2Nlc3NvckRldGFpbHNEaWFsb2dfaW5zdGFsbENsYXNzcGF0aCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCVRhYmxlVmlld2VyIGxpYnJhcnlWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIocGFyZW50KTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZ2QuaGVpZ2h0SGludCA9IDY7Ci0JCWxpYnJhcnlWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ2QpOwotCQlsaWJyYXJ5Vmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgSmFyQ29udGVudFByb3ZpZGVyKCkpOwotCQlsaWJyYXJ5Vmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEphckxhYmVsUHJvdmlkZXIoKSk7Ci0JCWxpYnJhcnlWaWV3ZXIuc2V0SW5wdXQoaW5zdGFsbCk7Ci0KLQkJYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JcHJpdmF0ZSBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkKLQl7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgc2VjdGlvbiB0aGF0IHRoaXMgZGlhbG9nIHN0b3JlcyBpdHMgc2V0dGluZ3MgaW4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlhbG9nU2V0dGluZ3NTZWN0aW9uTmFtZSgpCi0JewotCQlyZXR1cm4gIlhTTF9ERVRBSUxTX0RJQUxPR19TRUNUSU9OIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSURpYWxvZ1NldHRpbmdzIGdldERpYWxvZ0JvdW5kc1NldHRpbmdzKCkKLQl7Ci0JCUlEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IFhTTERlYnVnVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCUlEaWFsb2dTZXR0aW5ncyBzZWN0aW9uID0gc2V0dGluZ3MuZ2V0U2VjdGlvbihnZXREaWFsb2dTZXR0aW5nc1NlY3Rpb25OYW1lKCkpOwotCQlpZiAoc2VjdGlvbiA9PSBudWxsKQotCQl7Ci0JCQlzZWN0aW9uID0gc2V0dGluZ3MuYWRkTmV3U2VjdGlvbihnZXREaWFsb2dTZXR0aW5nc1NlY3Rpb25OYW1lKCkpOwotCQl9Ci0JCXJldHVybiBzZWN0aW9uOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkKLQl7Ci0JCS8vIGNyZWF0ZSBPSyBhbmQgQ2FuY2VsIGJ1dHRvbnMgYnkgZGVmYXVsdAotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCB0cnVlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL3Byb2Nlc3Nvci9Qcm9jZXNzb3JNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvcHJvY2Vzc29yL1Byb2Nlc3Nvck1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZTMxOGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvcHJvY2Vzc29yL1Byb2Nlc3Nvck1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMucHJvY2Vzc29yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGZpbmFsIGNsYXNzIFByb2Nlc3Nvck1lc3NhZ2VzIGV4dGVuZHMgTkxTCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5wcm9jZXNzb3IuUHJvY2Vzc29yTWVzc2FnZXMiOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc29yc0NvbWJvQmxvY2s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc29yc0NvbWJvQmxvY2tfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzb3JzQ29tYm9CbG9ja18xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNwZWNpZmljUHJvY2Vzc29yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5wdXRGaWxlQmxvY2tfV09SS1NQQUNFX0RJQUxPR19USVRMRTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NvckRldGFpbHNEaWFsb2dfVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzb3JEZXRhaWxzRGlhbG9nX2luc3RhbGxOYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc29yRGV0YWlsc0RpYWxvZ19pbnN0YWxsVHlwZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NvckRldGFpbHNEaWFsb2dfaW5zdGFsbENsYXNzcGF0aDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFByb2Nlc3NvckRpYWxvZ19FZGl0X1RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkUHJvY2Vzc29yRGlhbG9nX0FkZF9UaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFByb2Nlc3NvckRpYWxvZ19qYXJzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkUHJvY2Vzc29yRGlhbG9nX2ZlYXR1cmVzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkUHJvY2Vzc29yRGlhbG9nX3Byb2Nlc3Nvck5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRQcm9jZXNzb3JEaWFsb2dfcHJvY2Vzc29yVHlwZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NvckxpYnJhcnlCbG9ja19BZGRCdXR0b247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzb3JMaWJyYXJ5QmxvY2tfUmVtb3ZlQnV0dG9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc29yTGlicmFyeUJsb2NrX0FkZFdvcmtzcGFjZUJ1dHRvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFByb2Nlc3NvckRpYWxvZ19lbnRlck5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRQcm9jZXNzb3JEaWFsb2dfZHVwbGljYXRlTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFByb2Nlc3NvckRpYWxvZ19Qcm9jZXNzb3JfbmFtZV9tdXN0X2JlX2FfdmFsaWRfZmlsZV9uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc29yTGlicmFyeUJsb2NrX0ZpbGVEaWFsb2dfVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzb3JMaWJyYXJ5QmxvY2tfV29ya3NwYWNlRmlsZURpYWxvZ19UaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NvckxpYnJhcnlCbG9ja19Xb3Jrc3BhY2VGaWxlRGlhbG9nX01lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzb3JzVXBkYXRlcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtpbmdEaXJlY3RvcnlCbG9ja19ESVJFQ1RPUllfTk9UX1NQRUNJRklFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JraW5nRGlyZWN0b3J5QmxvY2tfRElSRUNUT1JZX0RPRVNfTk9UX0VYSVNUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtpbmdEaXJlY3RvcnlCbG9ja19ERUZBVUxUX1JBRElPOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtpbmdEaXJlY3RvcnlCbG9ja19PVEhFUl9SQURJTzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JraW5nRGlyZWN0b3J5QmxvY2tfRElBTE9HX01FU1NBR0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya2luZ0RpcmVjdG9yeUJsb2NrX1dPUktTUEFDRV9ESUFMT0dfTUVTU0FHRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JraW5nRGlyZWN0b3J5QmxvY2tfVkFSSUFCTEVTX0JVVFRPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JraW5nRGlyZWN0b3J5QmxvY2tfRklMRV9TWVNURU1fQlVUVE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtpbmdEaXJlY3RvcnlCbG9ja19XT1JLU1BBQ0VfQlVUVE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtpbmdEaXJlY3RvcnlCbG9ja19XT1JLU1BBQ0VfRElBTE9HX1RJVExFOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVVJJUmVzb2x2ZXJCbG9ja19ESVJFQ1RPUllfTk9UX1NQRUNJRklFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVUklSZXNvbHZlckJsb2NrX0RJUkVDVE9SWV9ET0VTX05PVF9FWElTVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVUklSZXNvbHZlckJsb2NrX0RFRkFVTFRfUkFESU87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVVJJUmVzb2x2ZXJCbG9ja19PVEhFUl9SQURJTzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVUklSZXNvbHZlckJsb2NrX0RJQUxPR19NRVNTQUdFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVSSVJlc29sdmVyQmxvY2tfV09SS1NQQUNFX0RJQUxPR19NRVNTQUdFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVSSVJlc29sdmVyQmxvY2tfVkFSSUFCTEVTX0JVVFRPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVUklSZXNvbHZlckJsb2NrX0ZJTEVfU1lTVEVNX0JVVFRPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVUklSZXNvbHZlckJsb2NrX1dPUktTUEFDRV9CVVRUT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVVJJUmVzb2x2ZXJCbG9ja19XT1JLU1BBQ0VfRElBTE9HX1RJVExFOwotCi0Jc3RhdGljCi0JewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgUHJvY2Vzc29yTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvcHJvY2Vzc29yL1Byb2Nlc3Nvck1lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9wcm9jZXNzb3IvUHJvY2Vzc29yTWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA4NjY4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9wcm9jZXNzb3IvUHJvY2Vzc29yTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLVByb2Nlc3NvcnNDb21ib0Jsb2NrPVhTTFQgUHJvY2Vzc29yCi1Qcm9jZXNzb3JzQ29tYm9CbG9ja18wPU5vIFhTTFQgcHJvY2Vzc29ycyBkZWZpbmVkIGluIHdvcmtzcGFjZQotUHJvY2Vzc29yc0NvbWJvQmxvY2tfMT0mSW5zdGFsbGVkIHByb2Nlc3NvcnMuLi4KLVNwZWNpZmljUHJvY2Vzc29yPUFsdGVybmF0ZSBQcm9jZXNzb3I6Ci0KLVVSSVJlc29sdmVyQmxvY2tfRElSRUNUT1JZX05PVF9TUEVDSUZJRUQ9VVJJIFJlc29sdmVyIGRpcmVjdG9yeSBub3Qgc3BlY2lmaWVkCi1VUklSZXNvbHZlckJsb2NrX0RJUkVDVE9SWV9ET0VTX05PVF9FWElTVD1VUkkgUmVzb2x2ZXIgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0Ci1VUklSZXNvbHZlckJsb2NrX0RFRkFVTFRfUkFESU89RGVmYXVsdCAocmVzb2x2ZSBVUklzIHJlbGF0aXZlIHRvIHRoZSB3b3JraW5nIGRpcmVjdG9yeSkKLVVSSVJlc29sdmVyQmxvY2tfT1RIRVJfUkFESU89T3RoZXIKLVVSSVJlc29sdmVyQmxvY2tfRElBTE9HX01FU1NBR0U9U2VsZWN0IGFuIGV4dGVybmFsIFVSSSByZXNvbHZlciBkaXJlY3RvcnkKLVVSSVJlc29sdmVyQmxvY2tfV09SS1NQQUNFX0RJQUxPR19NRVNTQUdFPVNlbGVjdCBhIFVSSSByZXNvbHZlciBkaXJlY3RvcnkgaW4gdGhlIHdvcmtzcGFjZQotVVJJUmVzb2x2ZXJCbG9ja19WQVJJQUJMRVNfQlVUVE9OPVZhcmlhYmxlcy4uLgotVVJJUmVzb2x2ZXJCbG9ja19GSUxFX1NZU1RFTV9CVVRUT049RmlsZSBTeXN0ZW0uLi4KLVVSSVJlc29sdmVyQmxvY2tfV09SS1NQQUNFX0JVVFRPTj1Xb3Jrc3BhY2UuLi4KLVVSSVJlc29sdmVyQmxvY2tfV09SS1NQQUNFX0RJQUxPR19USVRMRT1Gb2xkZXIgU2VsZWN0aW9uCi0KLQotVVJJUmVzb2x2ZXJCbG9ja18wPVdvcmtzcGFjZQotVVJJUmVzb2x2ZXJCbG9ja18xPUZpbGUgU3lzdGVtCi1VUklSZXNvbHZlckJsb2NrXzE3PVZhcmlhYmxlcwotVVJJUmVzb2x2ZXJCbG9ja183PVNlbGVjdCBhIGJhc2UgZGlyZWN0b3J5IGZvciB0aGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24KLVVSSVJlc29sdmVyQmxvY2tfND1TZWxlY3QgYSB3b3Jrc3BhY2UgcmVsYXRpdmUgYmFzZSBkaXJlY3RvcnkKLVVSSVJlc29sdmVyQmxvY2tfMTk9T3RoZXI6Ci1VUklSZXNvbHZlckJsb2NrXzE4PURlZmF1bHQKLVVSSVJlc29sdmVyQmxvY2tfMTI9QmFzZSBkaXJlY3RvcnkgZm9yIHJlc29sdmluZyBVUklzCi1VUklSZXNvbHZlckJsb2NrXzEwPUJhc2UgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0Ci1VUklSZXNvbHZlckJsb2NrXzIwPUJhc2UgZGlyZWN0b3J5IG5vdCBzcGVjaWZpZWQKLVVSSVJlc29sdmVyQmxvY2tfV29ya2luZ19EaXJlY3RvcnlfOD1VUkkgUmVzb2x2ZXIKLVVSSVJlc29sdmVyQmxvY2tfV09SS1NQQUNFX0RJQUxPR19USVRMRT1Gb2xkZXIgU2VsZWN0aW9uCi0KLVByb2Nlc3NvckRldGFpbHNEaWFsb2dfVGl0bGU9QnVpbHQtaW4gWFNMVCBQcm9jZXNzb3IKLVByb2Nlc3NvckRldGFpbHNEaWFsb2dfaW5zdGFsbE5hbWU9TmFtZToKLVByb2Nlc3NvckRldGFpbHNEaWFsb2dfaW5zdGFsbFR5cGU9VHlwZToKLVByb2Nlc3NvckRldGFpbHNEaWFsb2dfaW5zdGFsbENsYXNzcGF0aD1MaWJyYXJpZXM6Ci0KLUFkZFByb2Nlc3NvckRpYWxvZ19FZGl0X1RpdGxlPUVkaXQgUHJvY2Vzc29yCi1BZGRQcm9jZXNzb3JEaWFsb2dfQWRkX1RpdGxlPUFkZCBQcm9jZXNzb3IKLUFkZFByb2Nlc3NvckRpYWxvZ19wcm9jZXNzb3JOYW1lPVByb2Nlc3NvciBOYW1lOgotQWRkUHJvY2Vzc29yRGlhbG9nX3Byb2Nlc3NvclR5cGU9UHJvY2Vzc29yIFR5cGU6Ci1BZGRQcm9jZXNzb3JEaWFsb2dfamFycz1MaWJyYXJpZXM6Ci1BZGRQcm9jZXNzb3JEaWFsb2dfZmVhdHVyZXM9RmVhdHVyZXM6Ci1BZGRQcm9jZXNzb3JEaWFsb2dfZW50ZXJOYW1lPUEgbmFtZSBtdXN0IGJlIGVudGVyZWQgZm9yIHRoaXMgcHJvY2Vzc29yCi1BZGRQcm9jZXNzb3JEaWFsb2dfZHVwbGljYXRlTmFtZT1UaGUgbmFtZSBoYXMgYWxyZWFkeSBiZWVuIHVzZWQKLUFkZFByb2Nlc3NvckRpYWxvZ19Qcm9jZXNzb3JfbmFtZV9tdXN0X2JlX2FfdmFsaWRfZmlsZV9uYW1lPVByb2Nlc3NvciBuYW1lIG11c3QgYmUgYSB2YWxpZCBmaWxlIG5hbWUKLQotUHJvY2Vzc29yTGlicmFyeUJsb2NrX0FkZEJ1dHRvbj1BZGQgRXh0ZXJuYWwgSkFScwotUHJvY2Vzc29yTGlicmFyeUJsb2NrX0FkZFdvcmtzcGFjZUJ1dHRvbj1BZGQgV29ya3NwYWNlIEpBUnMKLVByb2Nlc3NvckxpYnJhcnlCbG9ja19SZW1vdmVCdXR0b249UmVtb3ZlCi1Qcm9jZXNzb3JMaWJyYXJ5QmxvY2tfRmlsZURpYWxvZ19UaXRsZT1FeHRlcm5hbCBKQVJzCi1Qcm9jZXNzb3JMaWJyYXJ5QmxvY2tfV29ya3NwYWNlRmlsZURpYWxvZ19UaXRsZT1Xb3Jrc3BhY2UgSkFScwotUHJvY2Vzc29yTGlicmFyeUJsb2NrX1dvcmtzcGFjZUZpbGVEaWFsb2dfTWVzc2FnZT1TZWxlY3QgdGhlIEpBUnMgdGhhdCBtYWtlIHVwIHRoZSBYU0xUIHByb2Nlc3NvcgotCi1Qcm9jZXNzb3JzVXBkYXRlcj1TYXZlIHByb2Nlc3NvciBzZXR0aW5ncwotCi0KLVdvcmtpbmdEaXJlY3RvcnlCbG9ja19ESVJFQ1RPUllfTk9UX1NQRUNJRklFRD1Xb3JraW5nIGRpcmVjdG9yeSBub3Qgc3BlY2lmaWVkCi1Xb3JraW5nRGlyZWN0b3J5QmxvY2tfRElSRUNUT1JZX0RPRVNfTk9UX0VYSVNUPVdvcmtpbmcgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0Ci1Xb3JraW5nRGlyZWN0b3J5QmxvY2tfREVGQVVMVF9SQURJTz1Xb3Jrc3BhY2UgZGVmYXVsdAotV29ya2luZ0RpcmVjdG9yeUJsb2NrX09USEVSX1JBRElPPU90aGVyCi1Xb3JraW5nRGlyZWN0b3J5QmxvY2tfRElBTE9HX01FU1NBR0U9U2VsZWN0IGFuIGV4dGVybmFsIHdvcmtpbmcgZGlyZWN0b3J5Ci1Xb3JraW5nRGlyZWN0b3J5QmxvY2tfV09SS1NQQUNFX0RJQUxPR19NRVNTQUdFPVNlbGVjdCBhIHdvcmtpbmcgZGlyZWN0b3J5IGluIHRoZSB3b3Jrc3BhY2UKLVdvcmtpbmdEaXJlY3RvcnlCbG9ja19WQVJJQUJMRVNfQlVUVE9OPVZhcmlhYmxlcy4uLgotV29ya2luZ0RpcmVjdG9yeUJsb2NrX0ZJTEVfU1lTVEVNX0JVVFRPTj1GaWxlIFN5c3RlbS4uLgotV29ya2luZ0RpcmVjdG9yeUJsb2NrX1dPUktTUEFDRV9CVVRUT049V29ya3NwYWNlLi4uCi1Xb3JraW5nRGlyZWN0b3J5QmxvY2tfV09SS1NQQUNFX0RJQUxPR19USVRMRT1Gb2xkZXIgU2VsZWN0aW9uCi0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvcHJvY2Vzc29yL1hTTFByb2Nlc3NvclRhYi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvcHJvY2Vzc29yL1hTTFByb2Nlc3NvclRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzE0YjlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL3Byb2Nlc3Nvci9YU0xQcm9jZXNzb3JUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5wcm9jZXNzb3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLlhTTExhdW5jaENvbmZpZ3VyYXRpb25UYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuSVByb2Nlc3Nvckludm9rZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5YU0xUUnVudGltZTsKLQotcHVibGljIGNsYXNzIFhTTFByb2Nlc3NvclRhYiBleHRlbmRzIFhTTExhdW5jaENvbmZpZ3VyYXRpb25UYWIKLXsKLQlwcml2YXRlIGZpbmFsIFByb2Nlc3NvckJsb2NrIHByb2Nlc3NvckJsb2NrOwotCS8vIHByaXZhdGUgV29ya2luZ0RpcmVjdG9yeUJsb2NrIHdvcmtpbmdEaXJlY3RvcnlCbG9jazsKLQkvLyBwcml2YXRlIFVSSVJlc29sdmVyQmxvY2syIGZlYXR1cmVzQmxvY2s7Ci0JcHJpdmF0ZSBmaW5hbCBGZWF0dXJlc0Jsb2NrIGZlYXR1cmVzQmxvY2s7Ci0KLQlwdWJsaWMgWFNMUHJvY2Vzc29yVGFiKCkKLQl7Ci0JCWZlYXR1cmVzQmxvY2sgPSBuZXcgRmVhdHVyZXNCbG9jaygpOwotCQlwcm9jZXNzb3JCbG9jayA9IG5ldyBQcm9jZXNzb3JCbG9jayhmZWF0dXJlc0Jsb2NrKTsKLQkJc2V0QmxvY2tzKG5ldyBJTGF1bmNoQ29uZmlndXJhdGlvblRhYltdCi0JCXsgcHJvY2Vzc29yQmxvY2ssIGZlYXR1cmVzQmxvY2sgfSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KQotCXsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCQlDb21wb3NpdGUgY29tcCA9IChDb21wb3NpdGUpIGdldENvbnRyb2woKTsKLQotCQlwcm9jZXNzb3JCbG9jay5jcmVhdGVDb250cm9sKGNvbXApOwotCQlmZWF0dXJlc0Jsb2NrLmNyZWF0ZUNvbnRyb2woY29tcCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcGVyZm9ybUFwcGx5KElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlndXJhdGlvbikKLQl7Ci0JCXN1cGVyLnBlcmZvcm1BcHBseShjb25maWd1cmF0aW9uKTsKLQkJLy8gVE9ETyBtYWtlIGEgbmV3IGJsb2NrIHRvIGFsbG93IHVzZXIgdG8gc2VsZWN0IHRoZSBpbnZva2VyCi0JCUlQcm9jZXNzb3JJbnZva2VyIGludm9rZXIgPSBYU0xUUnVudGltZS5nZXRQcm9jZXNzb3JJbnZva2VycygpWzBdOwotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLklOVk9LRVJfREVTQ1JJUFRPUiwgaW52b2tlci5nZXRJZCgpKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkJcmV0dXJuICJQcm9jZXNzb3IiOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpCi0JewotCQkvLyBUT0RPIGltYWdlCi0JCXJldHVybiBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotCXsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL3Jlc29sdmVyL1VSSVJlc29sdmVyQmxvY2suamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL3Jlc29sdmVyL1VSSVJlc29sdmVyQmxvY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY4Y2IyYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9yZXNvbHZlci9VUklSZXNvbHZlckJsb2NrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLnJlc29sdmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLlJlc291cmNlU2VsZWN0aW9uQmxvY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLnByb2Nlc3Nvci5Qcm9jZXNzb3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5YU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgVVJJUmVzb2x2ZXJCbG9jayBleHRlbmRzIFJlc291cmNlU2VsZWN0aW9uQmxvY2sKLXsKLQlwcml2YXRlIEJ1dHRvbiBzdHlsZXNoZWV0UmVsYXRpdmVSYWRpbzsKLQlwcml2YXRlIEJ1dHRvbiBvdGhlclJhZGlvOwotCXByaXZhdGUgQnV0dG9uIHdvcmtpbmdEaXJSZWxhdGl2ZVJhZGlvOwotCi0JcHVibGljIFVSSVJlc29sdmVyQmxvY2soKQotCXsKLQkJc3VwZXIoSVJlc291cmNlLkZPTERFUiwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNZXNzYWdlKGludCB0eXBlKQotCXsKLQkJc3dpdGNoICh0eXBlKQotCQl7Ci0JCQljYXNlIEVSUk9SX0RJUkVDVE9SWV9OT1RfU1BFQ0lGSUVEOgotCQkJCXJldHVybiBQcm9jZXNzb3JNZXNzYWdlcy5VUklSZXNvbHZlckJsb2NrX0RJUkVDVE9SWV9OT1RfU1BFQ0lGSUVEOwotCQkJY2FzZSBFUlJPUl9ESVJFQ1RPUllfRE9FU19OT1RfRVhJU1Q6Ci0JCQkJcmV0dXJuIFByb2Nlc3Nvck1lc3NhZ2VzLlVSSVJlc29sdmVyQmxvY2tfRElSRUNUT1JZX0RPRVNfTk9UX0VYSVNUOwotCQkJY2FzZSBHUk9VUF9OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIFVTRV9ERUZBVUxUX1JBRElPOgotCQkJCXJldHVybiBQcm9jZXNzb3JNZXNzYWdlcy5VUklSZXNvbHZlckJsb2NrX0RFRkFVTFRfUkFESU87Ci0JCQljYXNlIFVTRV9PVEhFUl9SQURJTzoKLQkJCQlyZXR1cm4gUHJvY2Vzc29yTWVzc2FnZXMuVVJJUmVzb2x2ZXJCbG9ja19PVEhFUl9SQURJTzsKLQkJCWNhc2UgRElSRUNUT1JZX0RJQUxPR19NRVNTQUdFOgotCQkJCXJldHVybiBQcm9jZXNzb3JNZXNzYWdlcy5VUklSZXNvbHZlckJsb2NrX0RJQUxPR19NRVNTQUdFOwotCQkJY2FzZSBXT1JLU1BBQ0VfRElBTE9HX01FU1NBR0U6Ci0JCQkJcmV0dXJuIFByb2Nlc3Nvck1lc3NhZ2VzLlVSSVJlc29sdmVyQmxvY2tfV09SS1NQQUNFX0RJQUxPR19NRVNTQUdFOwotCQkJY2FzZSBWQVJJQUJMRVNfQlVUVE9OOgotCQkJCXJldHVybiBQcm9jZXNzb3JNZXNzYWdlcy5VUklSZXNvbHZlckJsb2NrX1ZBUklBQkxFU19CVVRUT047Ci0JCQljYXNlIEZJTEVfU1lTVEVNX0JVVFRPTjoKLQkJCQlyZXR1cm4gUHJvY2Vzc29yTWVzc2FnZXMuVVJJUmVzb2x2ZXJCbG9ja19GSUxFX1NZU1RFTV9CVVRUT047Ci0JCQljYXNlIFdPUktTUEFDRV9CVVRUT046Ci0JCQkJcmV0dXJuIFByb2Nlc3Nvck1lc3NhZ2VzLlVSSVJlc29sdmVyQmxvY2tfV09SS1NQQUNFX0JVVFRPTjsKLQkJCWNhc2UgV09SS1NQQUNFX0RJQUxPR19USVRMRToKLQkJCQlyZXR1cm4gUHJvY2Vzc29yTWVzc2FnZXMuVVJJUmVzb2x2ZXJCbG9ja19XT1JLU1BBQ0VfRElBTE9HX1RJVExFOwotCQl9Ci0JCXJldHVybiAiIiArIHR5cGU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFJlc291cmNlKCkKLQl7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JCXJldHVybiAiVVJJIFJlc29sdmVyIjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKQotCXsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDaGVja2JveEFuZFRleHQoQ29tcG9zaXRlIHBhcmVudCkKLQl7Ci0JCXVzZURlZmF1bHRDaGVja0J1dHRvbiA9IGNyZWF0ZUNoZWNrQnV0dG9uKHBhcmVudCwgZ2V0TWVzc2FnZShVU0VfREVGQVVMVF9SQURJTykpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJdXNlRGVmYXVsdENoZWNrQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQl1c2VEZWZhdWx0Q2hlY2tCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIod2lkZ2V0TGlzdGVuZXIpOwotCi0JCUNvbXBvc2l0ZSBzcGVjaWZpY0ZpbGVDb21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5MZWZ0ID0gNTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCXNwZWNpZmljRmlsZUNvbXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJc3BlY2lmaWNGaWxlQ29tcC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpCi0JCXsKLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0JCQl7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0JCQl7Ci0JCQkJdXBkYXRlRW5hYmxlbWVudCh1c2VEZWZhdWx0Q2hlY2tCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCQl9OwotCi0JCXdvcmtpbmdEaXJSZWxhdGl2ZVJhZGlvID0gY3JlYXRlUmFkaW9CdXR0b24oc3BlY2lmaWNGaWxlQ29tcCwgIlJlbGF0aXZlIHRvIHdvcmtpbmcgZGlyZWN0b3J5Iik7Ci0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJd29ya2luZ0RpclJlbGF0aXZlUmFkaW8uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXdvcmtpbmdEaXJSZWxhdGl2ZVJhZGlvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQlzdHlsZXNoZWV0UmVsYXRpdmVSYWRpbyA9IGNyZWF0ZVJhZGlvQnV0dG9uKHNwZWNpZmljRmlsZUNvbXAsICJSZWxhdGl2ZSB0byAoMXN0KSBzdHlsZXNoZWV0Iik7Ci0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJc3R5bGVzaGVldFJlbGF0aXZlUmFkaW8uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXN0eWxlc2hlZXRSZWxhdGl2ZVJhZGlvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQlvdGhlclJhZGlvID0gY3JlYXRlUmFkaW9CdXR0b24oc3BlY2lmaWNGaWxlQ29tcCwgIlNwZWNpZmljIExvY2F0aW9uOiIpOwotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCW90aGVyUmFkaW8uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCW90aGVyUmFkaW8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXJlc291cmNlVGV4dCA9IG5ldyBUZXh0KHNwZWNpZmljRmlsZUNvbXAsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQlyZXNvdXJjZVRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJlc291cmNlVGV4dC5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCQlyZXNvdXJjZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIod2lkZ2V0TGlzdGVuZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVJlc291cmNlVGV4dChib29sZWFuIHVzZURlZmF1bHQpCi0JewotCQlpZiAodXNlRGVmYXVsdCkKLQkJewotCQkJcmVzb3VyY2VUZXh0LnNldFRleHQoZGVmYXVsdE91dHB1dEZpbGUgPT0gbnVsbCA/ICIiIDogZGVmYXVsdE91dHB1dEZpbGUpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcmVzb3VyY2VUZXh0LnNldFRleHQob3V0cHV0RmlsZSA9PSBudWxsID8gIiIgOiBvdXRwdXRGaWxlKTsKLQkJfQotCQl1cGRhdGVFbmFibGVtZW50KHVzZURlZmF1bHQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUVuYWJsZW1lbnQoYm9vbGVhbiB1c2VEZWZhdWx0KQotCXsKLQkJb3RoZXJSYWRpby5zZXRFbmFibGVkKCF1c2VEZWZhdWx0KTsKLQkJc3R5bGVzaGVldFJlbGF0aXZlUmFkaW8uc2V0RW5hYmxlZCghdXNlRGVmYXVsdCk7Ci0JCXdvcmtpbmdEaXJSZWxhdGl2ZVJhZGlvLnNldEVuYWJsZWQoIXVzZURlZmF1bHQpOwotCi0JCWJvb2xlYW4gb3RoZXJFbmFibGVkID0gIXVzZURlZmF1bHQgJiYgb3RoZXJSYWRpby5nZXRTZWxlY3Rpb24oKTsKLQkJcmVzb3VyY2VUZXh0LnNldEVuYWJsZWQob3RoZXJFbmFibGVkKTsKLQkJZkZpbGVTeXN0ZW1CdXR0b24uc2V0RW5hYmxlZChvdGhlckVuYWJsZWQpOwotCQlmVmFyaWFibGVzQnV0dG9uLnNldEVuYWJsZWQob3RoZXJFbmFibGVkKTsKLQkJZldvcmtzcGFjZUJ1dHRvbi5zZXRFbmFibGVkKG90aGVyRW5hYmxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybUFwcGx5KElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlndXJhdGlvbikKLQl7Ci0vLwkJaWYgKHdvcmtpbmdEaXJSZWxhdGl2ZVJhZGlvLmdldFNlbGVjdGlvbigpKQotLy8JCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfQkFTRV9VUklfVFlQRSwgWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5CQVNFX1VSSV9XT1JLSU5HX0RJUl9SRUxBVElWRSk7Ci0vLwkJZWxzZSBpZiAoc3R5bGVzaGVldFJlbGF0aXZlUmFkaW8uZ2V0U2VsZWN0aW9uKCkpCi0vLwkJCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9CQVNFX1VSSV9UWVBFLCBYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkJBU0VfVVJJX1NUWUxFU0hFRVRfUkVMQVRJVkUpOwotLy8JCWVsc2UgaWYgKG90aGVyUmFkaW8uZ2V0U2VsZWN0aW9uKCkpCi0vLwkJewotLy8JCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfQkFTRV9VUklfVFlQRSwgWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5CQVNFX1VSSV9BQlNPTFVURSk7Ci0vLwkJCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9CQVNFX1VSSV9ESVJFQ1RPUlksIGdldFRleHQoKSk7Ci0vLwkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRzKElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlnKQotCXsKLQkJY29uZmlnLnNldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfQkFTRV9VUklfRElSRUNUT1JZLCAoU3RyaW5nKSBudWxsKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9yZXNvbHZlci9VUklSZXNvbHZlckJsb2NrMi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvcmVzb2x2ZXIvVVJJUmVzb2x2ZXJCbG9jazIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRmMTZjNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9yZXNvbHZlci9VUklSZXNvbHZlckJsb2NrMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5yZXNvbHZlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLkFic3RyYWN0TGF1bmNoQ29uZmlndXJhdGlvblRhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi1wdWJsaWMgY2xhc3MgVVJJUmVzb2x2ZXJCbG9jazIgZXh0ZW5kcyBBYnN0cmFjdExhdW5jaENvbmZpZ3VyYXRpb25UYWIKLXsKLQlwcml2YXRlIEJ1dHRvbiBjdXN0b21SYWRpbzsKLQlwcml2YXRlIFRleHQgY3VzdG9tVGV4dDsKLQlwcml2YXRlIGZpbmFsIFJlc29sdmVyVHlwZVtdIHJlc29sdmVyVHlwZXMgPSBuZXcgUmVzb2x2ZXJUeXBlW10KLQl7IG5ldyBSZXNvbHZlclR5cGUoIk4vQSIsICJXb3JraW5nIERpcmVjdG9yeSAoZGVmYXVsdCkiKSwgbmV3IFJlc29sdmVyVHlwZSgib3JnLmVjbGlwc2Uud3N0LnNvbWUucmVzb2x2ZXIudHlwZS4xIiwgIlN0eWxlc2hlZXQiKSB9OwotCXByaXZhdGUgQnV0dG9uIGRlZmF1bHRSYWRpbzsKLQlwcml2YXRlIENvbWJvIGNvbWJvOwotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KQotCXsKLQkJRm9udCBmb250ID0gcGFyZW50LmdldEZvbnQoKTsKLQotCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OT05FKTsKLQkJZ3JvdXAuc2V0VGV4dChnZXROYW1lKCkpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlncm91cC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0JCWdyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlncm91cC5zZXRGb250KGZvbnQpOwotCi0JCXNldENvbnRyb2woZ3JvdXApOwotCi0JCWRlZmF1bHRSYWRpbyA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5SQURJTyk7Ci0JCWRlZmF1bHRSYWRpby5zZXRUZXh0KCJSZXNvbHZlIHJlbGF0aXZlIHRvOiIpOwotCQlkZWZhdWx0UmFkaW8uc2V0Rm9udChmb250KTsKLQkJZGVmYXVsdFJhZGlvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotCQkJewotCQkJCWN1c3RvbVRleHQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJY29tYm8uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl1cGRhdGVMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWNvbWJvID0gbmV3IENvbWJvKGdyb3VwLCBTV1QuUkVBRF9PTkxZKTsKLQkJQ29tYm9WaWV3ZXIgY1ZpZXdlciA9IG5ldyBDb21ib1ZpZXdlcihjb21ibyk7Ci0JCWNWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcigpCi0JCXsKLQotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpCi0JCQl7Ci0JCQkJcmV0dXJuIHJlc29sdmVyVHlwZXM7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotCQkJewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpCi0JCQl7Ci0JCQl9Ci0JCX0pOwotCQljVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IExhYmVsUHJvdmlkZXIoKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkKLQkJCXsKLQkJCQlSZXNvbHZlclR5cGUgdHlwZSA9IChSZXNvbHZlclR5cGUpIGVsZW1lbnQ7Ci0JCQkJcmV0dXJuIHR5cGUuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCX0KLQkJfSk7Ci0JCWNWaWV3ZXIuc2V0SW5wdXQocmVzb2x2ZXJUeXBlcyk7Ci0JCWNWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHJlc29sdmVyVHlwZXNbMF0pKTsKLQkJY1ZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKQotCQl7Ci0KLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KQotCQkJewotCQkJCXVwZGF0ZUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coKTsKLQkJCX0KLQkJfSk7Ci0KLQkJY3VzdG9tUmFkaW8gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUkFESU8pOwotCQljdXN0b21SYWRpby5zZXRUZXh0KCJVc2UgY3VzdG9tIFVSSSByZXNvbHZlciAoTm90ZTogY2xhc3MgbXVzdCBiZSBpbmNsdWRlZCBvbiBjbGFzc3BhdGgpIik7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWN1c3RvbVJhZGlvLnNldExheW91dERhdGEoZ2QpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWN1c3RvbVJhZGlvLnNldEZvbnQoZm9udCk7Ci0JCWN1c3RvbVJhZGlvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotCQkJewotCQkJCWN1c3RvbVRleHQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQljb21iby5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl1cGRhdGVMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCUNvbXBvc2l0ZSB0ZXh0Q29tcCA9IG5ldyBDb21wb3NpdGUoZ3JvdXAsIFNXVC5OT05FKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlnZC5ob3Jpem9udGFsSW5kZW50ID0gMTA7Ci0JCXRleHRDb21wLnNldExheW91dERhdGEoZ2QpOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDI7Ci0JCXRleHRDb21wLnNldExheW91dChsYXlvdXQpOwotCQl0ZXh0Q29tcC5zZXRGb250KGZvbnQpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHRleHRDb21wLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoIkNsYXNzOiIpOwotCi0JCWN1c3RvbVRleHQgPSBuZXcgVGV4dCh0ZXh0Q29tcCwgU1dULkJPUkRFUik7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWN1c3RvbVRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWN1c3RvbVRleHQuc2V0Rm9udChmb250KTsKLQkJY3VzdG9tVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKQotCQl7Ci0KLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkKLQkJCXsKLQkJCQl1cGRhdGVMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCQlyZXR1cm4gIlVSSSBSZXNvbHZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZChJTGF1bmNoQ29uZmlndXJhdGlvbiBsYXVuY2hDb25maWcpCi0JewotCQlTdHJpbmcgdGV4dCA9IGN1c3RvbVRleHQuZ2V0VGV4dCgpOwotCQlpZiAoY3VzdG9tUmFkaW8uZ2V0U2VsZWN0aW9uKCkgJiYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApKQotCQl7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoIk1pc3NpbmcgVVJJIFJlc29sdmVyIGNsYXNzIG5hbWUiKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuaXNWYWxpZChsYXVuY2hDb25maWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pCi0JewotCi0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybUFwcGx5KElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlndXJhdGlvbikKLQl7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdHMoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uKQotCXsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBSZXNvbHZlclR5cGUKLQl7Ci0JCXByaXZhdGUgZmluYWwgU3RyaW5nIGNsYXNzTmFtZTsKLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb247Ci0KLQkJcHVibGljIFJlc29sdmVyVHlwZShTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgZGVzY3JpcHRpb24pCi0JCXsKLQkJCXRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwotCQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKQotCQl7Ci0JCQlyZXR1cm4gY2xhc3NOYW1lOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpCi0JCXsKLQkJCXJldHVybiBkZXNjcmlwdGlvbjsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL3Jlc29sdmVyL1dvcmtpbmdEaXJlY3RvcnlCbG9jay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvcmVzb2x2ZXIvV29ya2luZ0RpcmVjdG9yeUJsb2NrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4Zjk3MTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvcmVzb2x2ZXIvV29ya2luZ0RpcmVjdG9yeUJsb2NrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLnJlc29sdmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnZhcmlhYmxlcy5JU3RyaW5nVmFyaWFibGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUudmFyaWFibGVzLlZhcmlhYmxlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLlJlc291cmNlU2VsZWN0aW9uQmxvY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5YU0xEZWJ1Z1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5wcm9jZXNzb3IuUHJvY2Vzc29yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50czsKLQotcHVibGljIGNsYXNzIFdvcmtpbmdEaXJlY3RvcnlCbG9jayBleHRlbmRzIFJlc291cmNlU2VsZWN0aW9uQmxvY2sKLXsKLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0V29ya2luZ0RpcjsKLQlwcml2YXRlIFRleHQgZGVmYXVsdFRleHQ7Ci0JcHJpdmF0ZSBCdXR0b24gdXNlU3BlY2lmaWNCdXR0b247Ci0KLQlwdWJsaWMgV29ya2luZ0RpcmVjdG9yeUJsb2NrKCkKLQl7Ci0JCXN1cGVyKElSZXNvdXJjZS5GT0xERVIsIGZhbHNlLCB0cnVlLCB0cnVlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1lc3NhZ2UoaW50IHR5cGUpCi0JewotCQlzd2l0Y2ggKHR5cGUpCi0JCXsKLQkJCWNhc2UgRVJST1JfRElSRUNUT1JZX05PVF9TUEVDSUZJRUQ6Ci0JCQkJcmV0dXJuIFByb2Nlc3Nvck1lc3NhZ2VzLldvcmtpbmdEaXJlY3RvcnlCbG9ja19ESVJFQ1RPUllfTk9UX1NQRUNJRklFRDsKLQkJCWNhc2UgRVJST1JfRElSRUNUT1JZX0RPRVNfTk9UX0VYSVNUOgotCQkJCXJldHVybiBQcm9jZXNzb3JNZXNzYWdlcy5Xb3JraW5nRGlyZWN0b3J5QmxvY2tfRElSRUNUT1JZX0RPRVNfTk9UX0VYSVNUOwotCQkJY2FzZSBHUk9VUF9OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIFVTRV9ERUZBVUxUX1JBRElPOgotCQkJCXJldHVybiBQcm9jZXNzb3JNZXNzYWdlcy5Xb3JraW5nRGlyZWN0b3J5QmxvY2tfREVGQVVMVF9SQURJTzsKLQkJCWNhc2UgVVNFX09USEVSX1JBRElPOgotCQkJCXJldHVybiBQcm9jZXNzb3JNZXNzYWdlcy5Xb3JraW5nRGlyZWN0b3J5QmxvY2tfT1RIRVJfUkFESU87Ci0JCQljYXNlIERJUkVDVE9SWV9ESUFMT0dfTUVTU0FHRToKLQkJCQlyZXR1cm4gUHJvY2Vzc29yTWVzc2FnZXMuV29ya2luZ0RpcmVjdG9yeUJsb2NrX0RJQUxPR19NRVNTQUdFOwotCQkJY2FzZSBXT1JLU1BBQ0VfRElBTE9HX01FU1NBR0U6Ci0JCQkJcmV0dXJuIFByb2Nlc3Nvck1lc3NhZ2VzLldvcmtpbmdEaXJlY3RvcnlCbG9ja19XT1JLU1BBQ0VfRElBTE9HX01FU1NBR0U7Ci0JCQljYXNlIFZBUklBQkxFU19CVVRUT046Ci0JCQkJcmV0dXJuIFByb2Nlc3Nvck1lc3NhZ2VzLldvcmtpbmdEaXJlY3RvcnlCbG9ja19WQVJJQUJMRVNfQlVUVE9OOwotCQkJY2FzZSBGSUxFX1NZU1RFTV9CVVRUT046Ci0JCQkJcmV0dXJuIFByb2Nlc3Nvck1lc3NhZ2VzLldvcmtpbmdEaXJlY3RvcnlCbG9ja19GSUxFX1NZU1RFTV9CVVRUT047Ci0JCQljYXNlIFdPUktTUEFDRV9CVVRUT046Ci0JCQkJcmV0dXJuIFByb2Nlc3Nvck1lc3NhZ2VzLldvcmtpbmdEaXJlY3RvcnlCbG9ja19XT1JLU1BBQ0VfQlVUVE9OOwotCQkJY2FzZSBXT1JLU1BBQ0VfRElBTE9HX1RJVExFOgotCQkJCXJldHVybiBQcm9jZXNzb3JNZXNzYWdlcy5Xb3JraW5nRGlyZWN0b3J5QmxvY2tfV09SS1NQQUNFX0RJQUxPR19USVRMRTsKLQkJfQotCQlyZXR1cm4gIiIgKyB0eXBlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNoZWNrYm94QW5kVGV4dChDb21wb3NpdGUgcGFyZW50KQotCXsKLQkJQ29tcG9zaXRlIHNwZWNpZmljRmlsZUNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkxlZnQgPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJc3BlY2lmaWNGaWxlQ29tcC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlzcGVjaWZpY0ZpbGVDb21wLnNldExheW91dERhdGEoZ2QpOwotCi0JCXVzZURlZmF1bHRDaGVja0J1dHRvbiA9IGNyZWF0ZVJhZGlvQnV0dG9uKHNwZWNpZmljRmlsZUNvbXAsICJEZWZhdWx0OiIpOwotCQl1c2VEZWZhdWx0Q2hlY2tCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIod2lkZ2V0TGlzdGVuZXIpOwotCi0JCWRlZmF1bHRUZXh0ID0gbmV3IFRleHQoc3BlY2lmaWNGaWxlQ29tcCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkZWZhdWx0VGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZGVmYXVsdFRleHQuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJZGVmYXVsdFRleHQuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJdXNlU3BlY2lmaWNCdXR0b24gPSBjcmVhdGVSYWRpb0J1dHRvbihzcGVjaWZpY0ZpbGVDb21wLCAiT3RoZXI6Iik7Ci0KLQkJcmVzb3VyY2VUZXh0ID0gbmV3IFRleHQoc3BlY2lmaWNGaWxlQ29tcCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlyZXNvdXJjZVRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJlc291cmNlVGV4dC5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCQlyZXNvdXJjZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIod2lkZ2V0TGlzdGVuZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRSZXNvdXJjZSgpCi0JewotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCQlyZXR1cm4gIldvcmtpbmcgRGlyZWN0b3J5IjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKQotCXsKLQkJdHJ5Ci0JCXsKLQkJCXNldExhdW5jaENvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbik7Ci0KLQkJCXVwZGF0ZURlZmF1bHRXb3JraW5nRGlyKCk7Ci0KLQkJCW91dHB1dEZpbGUgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfUFJPQ0VTU09SX1dPUktJTkdfRElSLCAoU3RyaW5nKSBudWxsKTsKLQkJCWJvb2xlYW4gdXNlRGVmYXVsdCA9IG91dHB1dEZpbGUgPT0gbnVsbDsKLQotCQkJdXNlRGVmYXVsdENoZWNrQnV0dG9uLnNldFNlbGVjdGlvbih1c2VEZWZhdWx0KTsKLQkJCXVzZVNwZWNpZmljQnV0dG9uLnNldFNlbGVjdGlvbighdXNlRGVmYXVsdCk7Ci0JCQlyZXNvdXJjZVRleHQuc2V0RW5hYmxlZCghdXNlRGVmYXVsdCk7Ci0KLQkJCWlmICh1c2VEZWZhdWx0KQotCQkJCW91dHB1dEZpbGUgPSAiIjsKLQotCQkJdXBkYXRlUmVzb3VyY2VUZXh0KHVzZURlZmF1bHQpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0JCXsKLQkJCVhTTERlYnVnVUlQbHVnaW4ubG9nKGUpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlUmVzb3VyY2VUZXh0KGJvb2xlYW4gdXNlRGVmYXVsdCkKLQl7Ci0JCXN1cGVyLnVwZGF0ZVJlc291cmNlVGV4dCh1c2VEZWZhdWx0KTsKLQkJZGVmYXVsdFRleHQuc2V0VGV4dChkZWZhdWx0V29ya2luZ0Rpcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlRGVmYXVsdFdvcmtpbmdEaXIoKQotCXsKLQkJdHJ5Ci0JCXsKLQkJCUlMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZyA9IGdldExhdW5jaENvbmZpZ3VyYXRpb24oKTsKLQkJCWlmIChjb25maWcgIT0gbnVsbCkKLQkJCXsKLQkJCQlTdHJpbmcgcGF0aEV4cHIgPSBjb25maWcuZ2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9JTlBVVF9GSUxFLCAoU3RyaW5nKSBudWxsKTsKLQkJCQlpZiAocGF0aEV4cHIgIT0gbnVsbCkKLQkJCQl7Ci0JCQkJCUlQYXRoIHBhdGggPSBnZXRQYXRoKHBhdGhFeHByKTsKLQkJCQkJaWYgKHBhdGggIT0gbnVsbCkKLQkJCQkJewotCQkJCQkJcGF0aCA9IHBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOwotCQkJCQkJZGVmYXVsdFdvcmtpbmdEaXIgPSBwYXRoLnRvUG9ydGFibGVTdHJpbmcoKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkKLQkJewotCQl9Ci0JCWRlZmF1bHRXb3JraW5nRGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpOwotCX0KLQotCXByaXZhdGUgUGF0aCBnZXRQYXRoKFN0cmluZyBpbnB1dEZpbGUpCi0JewotCQlQYXRoIHBhdGggPSBudWxsOwotCQlpZiAoaW5wdXRGaWxlLmluZGV4T2YoIiR7IikgPj0gMCkKLQkJewotCQkJSVN0cmluZ1ZhcmlhYmxlTWFuYWdlciBtYW5hZ2VyID0gVmFyaWFibGVzUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTdHJpbmdWYXJpYWJsZU1hbmFnZXIoKTsKLQkJCXRyeQotCQkJewotCQkJCW1hbmFnZXIudmFsaWRhdGVTdHJpbmdWYXJpYWJsZXMoaW5wdXRGaWxlKTsKLQkJCQlwYXRoID0gbmV3IFBhdGgobWFuYWdlci5wZXJmb3JtU3RyaW5nU3Vic3RpdHV0aW9uKGlucHV0RmlsZSkpOwotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLQkJCXsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChpbnB1dEZpbGUubGVuZ3RoKCkgPiAwKQotCQl7Ci0JCQlwYXRoID0gbmV3IFBhdGgoaW5wdXRGaWxlKTsKLQkJfQotCQlyZXR1cm4gcGF0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtQXBwbHkoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uKQotCXsKLQkJYm9vbGVhbiB1c2VEZWZhdWx0ID0gdXNlRGVmYXVsdENoZWNrQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfVVNFX0RFRkFVTFRfUFJPQ0VTU09SX1dPUktJTkdfRElSLCB1c2VEZWZhdWx0KTsKLQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BST0NFU1NPUl9XT1JLSU5HX0RJUiwgdXNlRGVmYXVsdCA/IG51bGwgOiBnZXRUZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRzKElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlndXJhdGlvbikKLQl7Ci0JCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9VU0VfREVGQVVMVF9QUk9DRVNTT1JfV09SS0lOR19ESVIsIHRydWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnKQotCXsKLQkJcmVxdWlyZWQgPSB1c2VTcGVjaWZpY0J1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQkJcmV0dXJuIHN1cGVyLmlzVmFsaWQoY29uZmlnKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNGU4NjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRhMjU1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWJ1aWxkLnhtbAotamF2YUNvbXBpbGVyLi4uYXJncwotdGVtcC5mb2xkZXIKLUBkb3QKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmI0MWY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZzwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmFjYzhmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVGh1IEphbiAwMyAyMjoyNDoyNSBFU1QgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOThmN2VlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jRnJpIEphbiAwNCAwMTowMjoxMyBFU1QgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNWQxZjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI0ZyaSBKYW4gMDQgMDk6MTI6MzQgRVNUIDIwMDgKLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MQotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5taXNzaW5nLWJ1bmRsZS1jbGFzc3BhdGgtZW50cmllcz0wCi1jb21waWxlcnMucC5taXNzaW5nLXBhY2thZ2VzPTIKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTEKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTEKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1YmYxMDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZztzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAwLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nLkxhdW5jaGluZ1BsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLAotIG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS5jb3JlLnZhcmlhYmxlcywKLSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLAotIG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLnVpLmlkZSwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZSwKLSBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLAotIG9yZy5lY2xpcHNlLndzdC54c2wuZGVidWcKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLUJ1bmRsZS1DbGFzc1BhdGg6IC4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZywKLSBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5jb25maWcsCi0gb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcubW9kZWwKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9UT0RPLnR4dCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvVE9ETy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNDc4ZGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9UT0RPLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLUlOVEVHUkFURSBPUkFOR0VWT0xUIFBBUlRTOgotCi0tIGxhdW5jaCBjb25maWd1cmF0aW9uIHR5cGUgaW1hZ2UKLS0ga2V5d29yZHMKLS0gbGF1bmNoIGNvbmZpZyBleHBvcnQKLQotLSB3aGVuIGRlYnVnZ2luZyB0b28gcXVpY2tseSwgZ2V0IGEgbnVsbCBwb2ludGVyIGV4Y2VwdGlvbiBiZWNhdXNlIHZhcmlhYmxlIHZpZXcgaXMgdHJ5aW5nIHRvIAotZ2V0IGEgdmFyaWFibGUgYXQgdGhlIHNhbWUgdGltZSBhcyB3ZSBoYXZlIG1vdmVkIG9uIHRvIHRoZSBuZXh0IGZyYW1lLgotCi0tIHNtb290aCB0cmFuc2l0aW9uIGJldHdlZW4gamF2YSBhbmQgWFNMVCBkZWJ1Z2dpbmcKLS0gcmVzdWx0IHZpZXcKLS0gbGluayBmcm9tIHJlc3VsdCB2aWV3IHRvIHNvdXJjZSArIHRlbXBsYXRlCi0tIHByb2ZpbGluZwotCi0tIGNoYW5nZSB2YXJpYWJsZSB2YWx1ZQotLSB3YXRjaCBleHByZXNzaW9ucwotLSBicmVha3BvaW50IGhpdCBjb3VudCAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL1czQ0ZlYXR1cmVzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL1czQ0ZlYXR1cmVzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMjQ0ZDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9XM0NGZWF0dXJlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL1czQ091dHB1dFByb3BlcnRpZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvVzNDT3V0cHV0UHJvcGVydGllcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWQyZmIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvVzNDT3V0cHV0UHJvcGVydGllcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJ5dGUtb3JkZXItbWFyaz1ieXRlLW9yZGVyLW1hcmsKLWJ5dGUtb3JkZXItbWFyay5ERVNDPU9uZSBvZiB0aGUgZW51bWVyYXRlZCB2YWx1ZXMgeWVzIG9yIG5vLiBUaGlzIHBhcmFtZXRlciBpbmRpY2F0ZXMgd2hldGhlciB0aGUgc2VyaWFsaXplZCBzZXF1ZW5jZSBvZiBvY3RldHMgaXMgdG8gYmUgcHJlY2VkZWQgYnkgYSBCeXRlIE9yZGVyIE1hcmsuIChTZWUgU2VjdGlvbiA1LjEgb2YgW1VuaWNvZGUgRW5jb2RpbmddLikgVGhlIGFjdHVhbCBvY3RldCBvcmRlciB1c2VkIGlzIGltcGxlbWVudGF0aW9uLWRlcGVuZGVudC4gSWYgdGhlIGVuY29kaW5nIGRlZmluZXMgbm8gQnl0ZSBPcmRlciBNYXJrLCBvciBpZiB0aGUgQnl0ZSBPcmRlciBNYXJrIGlzIHByb2hpYml0ZWQgZm9yIHRoZSBzcGVjaWZpYyBVbmljb2RlIGVuY29kaW5nIG9yIGltcGxlbWVudGF0aW9uIGVudmlyb25tZW50LCB0aGVuIHRoaXMgcGFyYW1ldGVyIGlzIGlnbm9yZWQuIAotCi1jZGF0YS1zZWN0aW9uLWVsZW1lbnRzPWNkYXRhLXNlY3Rpb24tZWxlbWVudHMgCi1jZGF0YS1zZWN0aW9uLWVsZW1lbnRzLkRFU0M9QSBsaXN0IG9mIGV4cGFuZGVkIFFOYW1lcywgcG9zc2libHkgZW1wdHkuIAotCi1kb2N0eXBlLXB1YmxpYz1kb2N0eXBlLXB1YmxpYwotZG9jdHlwZS1wdWJsaWMuREVTQz1BIHN0cmluZyBvZiBVbmljb2RlIGNoYXJhY3RlcnMuIFRoaXMgcGFyYW1ldGVyIG1heSBiZSBhYnNlbnQuIAotCi1kb2N0eXBlLXN5c3RlbT1kb2N0eXBlLXN5c3RlbQotZG9jdHlwZS1zeXN0ZW0uREVTQz1BIHN0cmluZyBvZiBVbmljb2RlIGNoYXJhY3RlcnMuIFRoaXMgcGFyYW1ldGVyIG1heSBiZSBhYnNlbnQuIAotCi1lbmNvZGluZz1lbmNvZGluZyAKLWVuY29kaW5nLkRFU0M9QSBzdHJpbmcgb2YgVW5pY29kZSBjaGFyYWN0ZXJzIGluIHRoZSByYW5nZSAjeDIxIHRvICN4N0UgKHRoYXQgaXMsIHByaW50YWJsZSBBU0NJSSBjaGFyYWN0ZXJzKTsgdGhlIHZhbHVlIFNIT1VMRCBiZSBhIGNoYXJzZXQgcmVnaXN0ZXJlZCB3aXRoIHRoZSBJbnRlcm5ldCBBc3NpZ25lZCBOdW1iZXJzIEF1dGhvcml0eSBbSUFOQV0sIFtSRkMyMjc4XSBvciBiZWdpbiB3aXRoIHRoZSBjaGFyYWN0ZXJzIHgtIG9yIFgtLiAKLQotZXNjYXBlLXVyaS1hdHRyaWJ1dGVzPWVzY2FwZS11cmktYXR0cmlidXRlcwotZXNjYXBlLXVyaS1hdHRyaWJ1dGVzLkRFU0M9T25lIG9mIHRoZSBlbnVtZXJhdGVkIHZhbHVlcyB5ZXMgb3Igbm8uIAotCi1pbmNsdWRlLWNvbnRlbnQtdHlwZT1pbmNsdWRlLWNvbnRlbnQtdHlwZQotaW5jbHVkZS1jb250ZW50LXR5cGUuREVTQz1PbmUgb2YgdGhlIGVudW1lcmF0ZWQgdmFsdWVzIHllcyBvciBuby4gCi0KLWluZGVudD1pbmRlbnQKLWluZGVudC5ERVNDPU9uZSBvZiB0aGUgZW51bWVyYXRlZCB2YWx1ZXMgeWVzIG9yIG5vLiAKLQotbWVkaWEtdHlwZT1tZWRpYS10eXBlCi1tZWRpYS10eXBlLkRFU0M9QSBzdHJpbmcgb2YgVW5pY29kZSBjaGFyYWN0ZXJzIHNwZWNpZnlpbmcgdGhlIG1lZGlhIHR5cGUgKE1JTUUgY29udGVudCB0eXBlKSBbUkZDMjA0Nl07IHRoZSBjaGFyc2V0IHBhcmFtZXRlciBvZiB0aGUgbWVkaWEgdHlwZSBNVVNUIE5PVCBiZSBzcGVjaWZpZWQgZXhwbGljaXRseSBpbiB0aGUgdmFsdWUgb2YgdGhlIG1lZGlhLXR5cGUgcGFyYW1ldGVyLiBJZiB0aGUgZGVzdGluYXRpb24gb2YgdGhlIHNlcmlhbGl6ZWQgb3V0cHV0IGlzIGFubm90YXRlZCB3aXRoIGEgbWVkaWEgdHlwZSwgdGhpcyBwYXJhbWV0ZXIgTUFZIGJlIHVzZWQgdG8gcHJvdmlkZSBzdWNoIGFuIGFubm90YXRpb24uIEZvciBleGFtcGxlLCBpdCBNQVkgYmUgdXNlZCB0byBzZXQgdGhlIG1lZGlhIHR5cGUgaW4gYW4gSFRUUCBoZWFkZXIuIAotCi1tZXRob2Q9bWV0aG9kCi1tZXRob2QuREVTQz1BbiBleHBhbmRlZCBRTmFtZSB3aXRoIGEgbnVsbCBuYW1lc3BhY2UgVVJJLCBhbmQgdGhlIGxvY2FsIHBhcnQgb2YgdGhlIG5hbWUgZXF1YWwgdG8gb25lIG9mIHhtbCwgeGh0bWwsIGh0bWwgb3IgdGV4dCwgb3IgaGF2aW5nIGEgbm9uLW51bGwgbmFtZXNwYWNlIFVSSS4gSWYgdGhlIG5hbWVzcGFjZSBVUkkgaXMgbm9uLW51bGwsIHRoZSBwYXJhbWV0ZXIgc3BlY2lmaWVzIGFuIGltcGxlbWVudGF0aW9uLWRlZmluZWQgb3V0cHV0IG1ldGhvZC4gCi0KLW5vcm1hbGl6YXRpb24tZm9ybT1ub3JtYWxpemF0aW9uLWZvcm0gCi1ub3JtYWxpemF0aW9uLWZvcm0uREVTQz1PbmUgb2YgdGhlIGVudW1lcmF0ZWQgdmFsdWVzIE5GQywgTkZELCBORktDLCBORktELCBmdWxseS1ub3JtYWxpemVkLCBub25lIG9yIGFuIGltcGxlbWVudGF0aW9uLWRlZmluZWQgdmFsdWUuIAotCi1vbWl0LXhtbC1kZWNsYXJhdGlvbj1vbWl0LXhtbC1kZWNsYXJhdGlvbiAKLW9taXQteG1sLWRlY2xhcmF0aW9uLkRFU0M9T25lIG9mIHRoZSBlbnVtZXJhdGVkIHZhbHVlcyB5ZXMgb3Igbm8uIAotCi1zdGFuZGFsb25lPXN0YW5kYWxvbmUgCi1zdGFuZGFsb25lLkRFU0M9T25lIG9mIHRoZSBlbnVtZXJhdGVkIHZhbHVlcyB5ZXMsIG5vIG9yIG9taXQuIAotCi11bmRlY2xhcmUtcHJlZml4ZXM9dW5kZWNsYXJlLXByZWZpeGVzIAotdW5kZWNsYXJlLXByZWZpeGVzLkRFU0M9T25lIG9mIHRoZSBlbnVtZXJhdGVkIHZhbHVlcyB5ZXMgb3Igbm8uIAotCi11c2UtY2hhcmFjdGVyLW1hcHM9dXNlLWNoYXJhY3Rlci1tYXBzIAotdXNlLWNoYXJhY3Rlci1tYXBzLkRFU0M9QSBsaXN0IG9mIHBhaXJzLCBwb3NzaWJseSBlbXB0eSwgd2l0aCBlYWNoIHBhaXIgY29uc2lzdGluZyBvZiBhIHNpbmdsZSBVbmljb2RlIGNoYXJhY3RlciBhbmQgYSBzdHJpbmcgb2YgVW5pY29kZSBjaGFyYWN0ZXJzLiAKLQotdmVyc2lvbj12ZXJzaW9uIAotdmVyc2lvbi5ERVNDPUEgc3RyaW5nIG9mIFVuaWNvZGUgY2hhcmFjdGVycy4gClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2RiMzZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjE0NGM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIFczQ0ZlYXR1cmVzLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgVzNDT3V0cHV0UHJvcGVydGllcy5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHNjaGVtYS8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotamFycy5jb21waWxlLm9yZGVyID0gLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjZhN2RlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jUHJvcGVydGllcyBmaWxlIGZvciBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZwotQnVuZGxlLU5hbWUuMCA9IFhTTCBMYXVuY2hpbmcgUGx1Zy1pbiAoSW5jdWJhdGluZykKLWxhdW5jaENvbmZpZ3VyYXRpb25UeXBlLm5hbWUuMCA9IFhTTAotc291cmNlTG9jYXRvci5uYW1lLjAgPSBYU0xUIFNvdXJjZSBMb29rdXAgRGlyZWN0b3IKLXByb2Nlc3NvclR5cGUubGFiZWwuMCA9IEpSRSBEZWZhdWx0Ci1wcm9jZXNzb3IubGFiZWwuMCA9IEpSRSBJbnN0YW5jZSBEZWZhdWx0Ci1leHRlbnNpb24tcG9pbnQubmFtZS4wID0gWFNMVCBQcm9jZXNzb3IgSW52b2tlcgotZXh0ZW5zaW9uLXBvaW50Lm5hbWUuMSA9IFhTTFQgUHJvY2Vzc29yIFR5cGUKLWV4dGVuc2lvbi1wb2ludC5uYW1lLjIgPSBYU0xUIFByb2Nlc3NvcgotZXh0ZW5zaW9uLXBvaW50Lm5hbWUuMyA9IFhTTFQgRGVidWdnZXIKLUJ1bmRsZS1WZW5kb3IuMCA9IEVjbGlwc2Uub3JnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDMyNzg4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08cGx1Z2luPgotCTxleHRlbnNpb24tcG9pbnQgaWQ9Imludm9rZSIgbmFtZT0iJWV4dGVuc2lvbi1wb2ludC5uYW1lLjAiCi0JCXNjaGVtYT0ic2NoZW1hL2ludm9rZS5leHNkIiAvPgotCTxleHRlbnNpb24tcG9pbnQgaWQ9InByb2Nlc3NvclR5cGUiIG5hbWU9IiVleHRlbnNpb24tcG9pbnQubmFtZS4xIgotCQlzY2hlbWE9InNjaGVtYS9wcm9jZXNzb3JUeXBlLmV4c2QiIC8+Ci0JPGV4dGVuc2lvbi1wb2ludCBpZD0icHJvY2Vzc29yIiBuYW1lPSIlZXh0ZW5zaW9uLXBvaW50Lm5hbWUuMiIKLQkJc2NoZW1hPSJzY2hlbWEvcHJvY2Vzc29yLmV4c2QiIC8+Ci0JPGV4dGVuc2lvbi1wb2ludCBpZD0iZGVidWdnZXIiIG5hbWU9IiVleHRlbnNpb24tcG9pbnQubmFtZS4zIiBzY2hlbWE9InNjaGVtYS9kZWJ1Z2dlci5leHNkIi8+Ci0KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlcyI+Ci0JCTxsYXVuY2hDb25maWd1cmF0aW9uVHlwZQotICAgICAgICAgICAgc291cmNlTG9jYXRvcklkPSJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5zb3VyY2VMb29rdXBEaXJlY3RvciIKLSAgICAgICAgICAgIHNvdXJjZVBhdGhDb21wdXRlcklkPSJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5zb3VyY2VQYXRoQ29tcHV0ZXIiCi0JCQlkZWxlZ2F0ZT0ib3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmcuWFNMVExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5sYXVuY2hDb25maWd1cmF0aW9uVHlwZSIKLQkJCW1vZGVzPSJydW4sIGRlYnVnLCBwcm9maWxlIiBuYW1lPSIlbGF1bmNoQ29uZmlndXJhdGlvblR5cGUubmFtZS4wIiAvPgotCTwvZXh0ZW5zaW9uPgotCQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlTG9jYXRvcnMiPgotICAgICAgPHNvdXJjZUxvY2F0b3IKLSAgICAgICAgICAgIG5hbWU9IiVzb3VyY2VMb2NhdG9yLm5hbWUuMCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZy5YU0xUU291cmNlTG9va3VwRGlyZWN0b3IiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuc291cmNlTG9va3VwRGlyZWN0b3IiPgotICAgICAgPC9zb3VyY2VMb2NhdG9yPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZVBhdGhDb21wdXRlcnMiPgotICAgICAgPHNvdXJjZVBhdGhDb21wdXRlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nLlhTTFRTb3VyY2VQYXRoQ29tcHV0ZXJEZWxlZ2F0ZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5zb3VyY2VQYXRoQ29tcHV0ZXIiPgotICAgICAgPC9zb3VyY2VQYXRoQ29tcHV0ZXI+Ci0gICA8L2V4dGVuc2lvbj4KLQkKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLmJyZWFrcG9pbnRzIj4KLSAgICAgIDxicmVha3BvaW50Ci0gICAgICAJCWlkPSJ4c2xMaW5lQnJlYWtwb2ludCIKLSAgICAgICAgICAgIG1hcmtlclR5cGU9Im9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLnhzbExpbmVCcmVha3BvaW50TWFya2VyIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLm1vZGVsLlhTTExpbmVCcmVha3BvaW50Ij4KLSAgICAgIDwvYnJlYWtwb2ludD4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0ieHNsTGluZUJyZWFrcG9pbnRNYXJrZXIiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFya2VycyI+Ci0gICAgICA8c3VwZXIKLSAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubGluZUJyZWFrcG9pbnRNYXJrZXIiPgotICAgICAgPC9zdXBlcj4KLSAgICAgIDxwZXJzaXN0ZW50Ci0gICAgICAgICAgICB2YWx1ZT0idHJ1ZSI+Ci0gICAgICA8L3BlcnNpc3RlbnQ+Ci0gICA8L2V4dGVuc2lvbj4KLSAJCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzIj4KLQkJPGluaXRpYWxpemVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmcuUHJlZmVyZW5jZUluaXRpYWxpemVyIj4KLQkJPC9pbml0aWFsaXplcj4KLQk8L2V4dGVuc2lvbj4KLSAKLSAJPGV4dGVuc2lvbgotCSAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcucHJvY2Vzc29yVHlwZSI+Ci0gICAgIDxwcm9jZXNzb3JUeXBlCi0gICAgICAgICAgICBmZWF0dXJlUHJvcGVydGllcz0iVzNDUHJvY2Vzc29yRmVhdHVyZXMucHJvcGVydGllcyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5wcm9jZXNzb3JUeXBlLmpyZURlZmF1bHQiCi0gICAgICAgICAgICBsYWJlbD0iJXByb2Nlc3NvclR5cGUubGFiZWwuMCIKLSAgICAgICAgICAgIG91dHB1dFByb3BlcnRpZXM9IlczQ091dHB1dFByb3BlcnRpZXMucHJvcGVydGllcyIgLz4KLQkgPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uCi0JICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLnByb2Nlc3NvciI+Ci0gICAgICAgIDxwcm9jZXNzb3IKLSAgICAgICAgICAgICAgY2xhc3NwYXRoPSIiCi0gICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5qcmUuZGVmYXVsdCIKLSAgICAgICAgICAgICAgbGFiZWw9IiVwcm9jZXNzb3IubGFiZWwuMCIKLSAgICAgICAgICAgICAgcHJvY2Vzc29yVHlwZUlkPSJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5wcm9jZXNzb3JUeXBlLmpyZURlZmF1bHQiCi0gICAgICAgICAgICAgIHN1cHBvcnRzPSIxLjAiLz4KLQkgPC9leHRlbnNpb24+Ci0JCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc2NoZW1hL2RlYnVnZ2VyLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NjaGVtYS9kZWJ1Z2dlci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2QyN2UyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc2NoZW1hL2RlYnVnZ2VyLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmciPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nIiBpZD0iZGVidWdnZXIiIG5hbWU9IlhTTFQgRGVidWdnZXIiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBhbnkgb3RoZXIgcGx1Z2lucy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImRlYnVnZ2VyIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImRlYnVnZ2VyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc3BhdGgiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJvY2Vzc29yVHlwZUlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzTmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBhbnkgb3RoZXIgcGx1Z2lucy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtICZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsmcXVvdDsmZ3Q7aHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsmbHQ7L2EmZ3Q7LiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NjaGVtYS9pbnZva2UuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc2NoZW1hL2ludm9rZS5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDU2ZDJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc2NoZW1hL2ludm9rZS5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZyIgaWQ9Imludm9rZSIgbmFtZT0iWFNMVCBQcm9jZXNzb3IgSW52b2tlciIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iaW52b2tlciIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJpbnZva2VyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVW5pcXVlIGlkIGZvciB0aGlzIGludm9rZXIKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgSVByb2Nlc3Nvckludm9rZXIgaW50ZXJmYWNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NwYXRoIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgc2VtaS1jb2xvbiBzZXBhcmF0ZWQgbGlzdCBvZiBqYXJzIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBjb250cmlidXRpbmcgcGx1Z2luLiBPbmUgb2YgdGhlIGphcnMgbXVzdCBjb250YWluIHRoZSBJbnZva2VyIGNsYXNzIG5hbWVkIGluIHRoZSBjbGFzcyBhdHRyaWJ1dGUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSAmbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrJmx0Oy9hJmd0Oy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zY2hlbWEvcHJvY2Vzc29yLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NjaGVtYS9wcm9jZXNzb3IuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEzNDVmYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NjaGVtYS9wcm9jZXNzb3IuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZyI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmciIGlkPSJwcm9jZXNzb3IiIG5hbWU9IlhTTFQgUHJvY2Vzc29yIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvbnRyaWJ1dGUgYSBKYXZhIFhTTFQgcHJvY2Vzc29yIGluc3RhbmNlIChlLmcuIFhhbGFuIDIuNy4wKS4gVGhlIGV4dGVuc2lvbiBwb2ludCBwcmltYXJpbHkgZGVmaW5lcyB0aGUgY2xhc3NwYXRoIHRvIGJlIHVzZWQgd2hlbiBsYXVuY2hpbmcgYW4gWFNMVCB0cmFuc2Zvcm1hdGlvbi4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icHJvY2Vzc29yIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InByb2Nlc3NvciI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0ibGFiZWwiLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibGFiZWwiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcm9jZXNzb3JUeXBlSWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NwYXRoIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlYnVnZ2VySWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3VwcG9ydHMiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBzdXBwb3J0ZWQgWFNMVCB2ZXJzaW9ucyBlLmcuIDEuMCwyLjAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5wcm9jZXNzb3ImcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7cHJvY2Vzc29yCi0gICAgICAgICAgICBjbGFzc3BhdGg9JnF1b3Q7eGFsYW4yLjcuMC5qYXI7c2VyaWFsaXplcjIuNy4wLmphciZxdW90OwotICAgICAgICAgICAgaWQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcueGFsYW4uMl83XzAmcXVvdDsKLSAgICAgICAgICAgIGxhYmVsPSZxdW90O1hhbGFuIDIuNy4wJnF1b3Q7Ci0gICAgICAgICAgICBwcm9jZXNzb3JUeXBlSWQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi5wcm9jZXNzb3JUeXBlJnF1b3Q7Ci0gICAgICAgICAgICBkZWJ1Z2dlcklkPSZxdW90O29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4uZGVidWdnZXImcXVvdDsKLSAgICAgICAgICAgIHN1cHBvcnRzPSZxdW90OzEuMCZxdW90OyZndDsKLSAgICAgICZsdDsvcHJvY2Vzc29yJmd0OwotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSAmbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrJmx0Oy9hJmd0Oy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zY2hlbWEvcHJvY2Vzc29yVHlwZS5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zY2hlbWEvcHJvY2Vzc29yVHlwZS5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjk2ZmUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc2NoZW1hL3Byb2Nlc3NvclR5cGUuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZyI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmciIGlkPSJwcm9jZXNzb3JUeXBlIiBuYW1lPSJYU0xUIFByb2Nlc3NvciBUeXBlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvbnRyaWJ1dGUgYSBKYXZhIFhTTFQgcHJvY2Vzc29yIHR5cGUgKGUuZy4gWGFsYW4sIFNheG9uKS4gVGhlIHByb2Nlc3NvciB0eXBlIGRlZmluZXMgd2hpY2ggZmVhdHVyZXMgYW5kIG91dHB1dCBwcm9wZXJpZXMgYXJlIHN1cHBvcnRlZC4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icHJvY2Vzc29yVHlwZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJwcm9jZXNzb3JUeXBlIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJsYWJlbCIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBVbmlxdWUgaWQgZm9yIHRoZSBwcm9jZXNzb3IgdHlwZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImxhYmVsIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIE5hbWUgZm9yIGRpc3BsYXkgaW4gdGhlIFVJCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0cmFuc2Zvcm1lckZhY3RvcnkiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVHJhbnNmb3JtZXIgZmFjdG9yeSBjbGFzcyBuYW1lIGZvciB0aGlzIHByb2Nlc3NvciB0eXBlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3V0cHV0UHJvcGVydGllcyIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBMb2NhdGlvbiBvZiBhIHByb3BlcnRpZXMgZmlsZSBjb250YWluaW5nIHRoZSBsaXN0IG9mIHRoZSBwcm9jZXNzb3JzIG91dHB1dCBwcm9wZXJ0aWVzLiBNdXN0IGJlIGEgcGF0aCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgYnVuZGxlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImZlYXR1cmVQcm9wZXJ0aWVzIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIExvY2F0aW9uIG9mIGEgcHJvcGVydGllcyBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpc3Qgb2YgdGhlIGZlYXR1cmVzIHN1cHBvcnRlZCBieSB0aGlzIHByb2Nlc3Nvci4gTXVzdCBiZSBhIHBhdGggcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIGJ1bmRsZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5wcm9jZXNzb3JUeXBlJnF1b3Q7Jmd0OwotICAgICAgJmx0O3Byb2Nlc3NvclR5cGUKLSAgICAgICAgICAgIGZlYXR1cmVQcm9wZXJ0aWVzPSZxdW90O1hhbGFuRmVhdHVyZXMucHJvcGVydGllcyZxdW90OwotICAgICAgICAgICAgaWQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi5wcm9jZXNzb3JUeXBlJnF1b3Q7Ci0gICAgICAgICAgICBsYWJlbD0mcXVvdDtYYWxhbiZxdW90OwotICAgICAgICAgICAgb3V0cHV0UHJvcGVydGllcz0mcXVvdDtYYWxhbk91dHB1dFByb3BlcnRpZXMucHJvcGVydGllcyZxdW90OwotICAgICAgICAgICAgdHJhbnNmb3JtZXJGYWN0b3J5PSZxdW90O29yZy5hcGFjaGUueGFsYW4ucHJvY2Vzc29yLlRyYW5zZm9ybWVyRmFjdG9yeUltcGwmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7L3Byb2Nlc3NvclR5cGUmZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtICZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsmcXVvdDsmZ3Q7aHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsmbHQ7L2EmZ3Q7LiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9EZWJ1Z2dlckRlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL0RlYnVnZ2VyRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGI0ODFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL0RlYnVnZ2VyRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLklEZWJ1Z2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5JUHJvY2Vzc29yVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5YU0xUUnVudGltZTsKLQotcHVibGljIGNsYXNzIERlYnVnZ2VyRGVzY3JpcHRvciBpbXBsZW1lbnRzIElEZWJ1Z2dlcgotewotCXByaXZhdGUgZmluYWwgU3RyaW5nW10gY2xhc3NwYXRoOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGlkOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGJ1bmRsZUlkOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcHJvY2Vzc29yVHlwZUlkOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGNsYXNzTmFtZTsKLQotCXB1YmxpYyBEZWJ1Z2dlckRlc2NyaXB0b3IoU3RyaW5nIGlkLCBTdHJpbmcgYnVuZGxlSWQsIFN0cmluZyBjbGFzc05hbWUsIFN0cmluZ1tdIGNsYXNzcGF0aCwgU3RyaW5nIG5hbWUsIFN0cmluZyBwcm9jZXNzb3JUeXBlSWQpCi0JewotCQl0aGlzLmlkID0gaWQ7Ci0JCXRoaXMuY2xhc3NwYXRoID0gY2xhc3NwYXRoOwotCQl0aGlzLmJ1bmRsZUlkID0gYnVuZGxlSWQ7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMucHJvY2Vzc29yVHlwZUlkID0gcHJvY2Vzc29yVHlwZUlkOwotCQl0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpCi0JewotCQlyZXR1cm4gY2xhc3NOYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRDbGFzc1BhdGgoKQotCXsKLQkJTGlzdDxTdHJpbmc+IGVudHJpZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJdHJ5IAotCQl7Ci0JCQkvLyBpbiBkZXYsIGFkZCB0aGUgYmluIGRpcgotCQkJaWYgKFBsYXRmb3JtLmluRGV2ZWxvcG1lbnRNb2RlKCkpCi0JCQkJZW50cmllcy5hZGQoVXRpbHMuZ2V0RmlsZUxvY2F0aW9uKGJ1bmRsZUlkLCAiL2JpbiIpKTsKLQkJCWZvciAoU3RyaW5nIGphciA6IGNsYXNzcGF0aCkKLQkJCXsKLQkJCQlTdHJpbmcgZW50cnkgPSBVdGlscy5nZXRGaWxlTG9jYXRpb24oYnVuZGxlSWQsICIvIiArIGphcik7Ci0JCQkJaWYgKGVudHJ5IT1udWxsKQotCQkJCQllbnRyaWVzLmFkZChlbnRyeSk7Ci0JCQl9Ci0JCX0gCi0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIAotCQl7Ci0JCQlMYXVuY2hpbmdQbHVnaW4ubG9nKGUpOwotCQl9Ci0JCXJldHVybiBlbnRyaWVzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJZCgpCi0JewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCXB1YmxpYyBJUHJvY2Vzc29yVHlwZSBnZXRQcm9jZXNzb3JUeXBlKCkKLQl7Ci0JCXJldHVybiBYU0xUUnVudGltZS5nZXRQcm9jZXNzb3JUeXBlKHByb2Nlc3NvclR5cGVJZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvRmVhdHVyZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjgxMmFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL0ZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvbnZlbnRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLklGZWF0dXJlOwotCi1wdWJsaWMgY2xhc3MgRmVhdHVyZSBpbXBsZW1lbnRzIElGZWF0dXJlLCBDb21wYXJhYmxlPE9iamVjdD4KLXsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyB1cmk7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb247Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdHlwZTsKLQotCXB1YmxpYyBGZWF0dXJlKFN0cmluZyB1cmksIFN0cmluZyB0eXBlLCBTdHJpbmcgZGVzY3JpcHRpb24pCi0JewotCQl0aGlzLnVyaSA9IHVyaTsKLQkJdGhpcy50eXBlID0gdHlwZTsKLQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKQotCXsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpCi0JewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFVSSSgpCi0JewotCQlyZXR1cm4gdXJpOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlVmFsdWUoU3RyaW5nIHZhbHVlKQotCXsKLQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCQlpZiAoVFlQRV9CT09MRUFOLmVxdWFscyh0eXBlKSkKLQkJewotCQkJYm9vbGVhbiB2YWxpZCA9ICJ0cnVlIi5lcXVhbHModmFsdWUpIHx8ICJmYWxzZSIuZXF1YWxzKHZhbHVlKTsKLQkJCWlmICghdmFsaWQpCi0JCQkJc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lELCAwLCAiVmFsaWQgdmFsdWVzIGFyZSAndHJ1ZScgb3IgJ2ZhbHNlJyIsIG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKFRZUEVfSU5ULmVxdWFscyh0eXBlKSkKLQkJewotCQkJdHJ5Ci0JCQl7Ci0JCQkJSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7Ci0JCQl9Ci0JCQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpCi0JCQl7Ci0JCQkJc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lELCAwLCAiVmFsdWUgbXVzdCBiZSBhbiBpbnRlZ2VyIiwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoVFlQRV9ET1VCTEUuZXF1YWxzKHR5cGUpKQotCQl7Ci0JCQl0cnkKLQkJCXsKLQkJCQlEb3VibGUucGFyc2VEb3VibGUodmFsdWUpOwotCQkJfQotCQkJY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKQotCQkJewotCQkJCXN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCwgMCwgIlZhbHVlIG11c3QgYmUgYSBkb3VibGUiLCBudWxsKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChUWVBFX0ZMT0FULmVxdWFscyh0eXBlKSkKLQkJewotCQkJdHJ5Ci0JCQl7Ci0JCQkJRmxvYXQucGFyc2VGbG9hdCh2YWx1ZSk7Ci0JCQl9Ci0JCQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpCi0JCQl7Ci0JCQkJc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lELCAwLCAiVmFsdWUgbXVzdCBiZSBhIGZsb2F0IiwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoVFlQRV9DTEFTUy5lcXVhbHModHlwZSkgfHwgVFlQRV9PQkpFQ1QuZXF1YWxzKHR5cGUpKQotCQl7Ci0JCQlzdGF0dXMgPSBKYXZhQ29udmVudGlvbnMudmFsaWRhdGVKYXZhVHlwZU5hbWUodmFsdWUpOwotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG8pCi0JewotCQlpZiAobyBpbnN0YW5jZW9mIElGZWF0dXJlKQotCQl7Ci0JCQlJRmVhdHVyZSBmID0gKElGZWF0dXJlKSBvOwotCQkJcmV0dXJuIGYuZ2V0VVJJKCkuY29tcGFyZVRvKGdldFVSSSgpKTsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9GZWF0dXJlUHJlZmVyZW5jZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL0ZlYXR1cmVQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODNkMmNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL0ZlYXR1cmVQcmVmZXJlbmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgRmVhdHVyZVByZWZlcmVuY2VzCi17Ci0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBTdHJpbmc+PiB0eXBlRmVhdHVyZXM7Ci0KLQlwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRGZWF0dXJlc1ZhbHVlcyhTdHJpbmcgdHlwZUlkKQotCXsKLQkJcmV0dXJuIHR5cGVGZWF0dXJlcy5nZXQodHlwZUlkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUeXBlRmVhdHVyZXMoTWFwPFN0cmluZywgTWFwPFN0cmluZywgU3RyaW5nPj4gdHlwZUZlYXR1cmVzKQotCXsKLQkJdGhpcy50eXBlRmVhdHVyZXMgPSB0eXBlRmVhdHVyZXM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBc1hNTCgpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgVHJhbnNmb3JtZXJFeGNlcHRpb24KLQl7Ci0JCURvY3VtZW50IGRvYyA9IFByZWZlcmVuY2VVdGlsLmdldERvY3VtZW50KCk7Ci0JCUVsZW1lbnQgY29uZmlnID0gZG9jLmNyZWF0ZUVsZW1lbnQoImZlYXR1cmVQcmVmZXJlbmNlcyIpOyAKLQkJZG9jLmFwcGVuZENoaWxkKGNvbmZpZyk7Ci0JCQotCQlmb3IgKFN0cmluZyB0eXBlSWQgOiB0eXBlRmVhdHVyZXMua2V5U2V0KCkpCi0JCXsKLQkJCUVsZW1lbnQgcHJvY2Vzc29yVHlwZUVsZW1lbnQgPSB0eXBlQXNFbGVtZW50KGRvYywgdHlwZUlkKTsKLQkJCU1hcDxTdHJpbmcsIFN0cmluZz4gZmVhdHVyZVZhbHVlcyA9IHR5cGVGZWF0dXJlcy5nZXQodHlwZUlkKTsKLQkJCWZlYXR1cmVWYWx1ZXNBc0VsZW1lbnQoZG9jLCBwcm9jZXNzb3JUeXBlRWxlbWVudCwgZmVhdHVyZVZhbHVlcyk7Ci0JCQljb25maWcuYXBwZW5kQ2hpbGQocHJvY2Vzc29yVHlwZUVsZW1lbnQpOwotCQl9Ci0KLQkJLy8gU2VyaWFsaXplIHRoZSBEb2N1bWVudCBhbmQgcmV0dXJuIHRoZSByZXN1bHRpbmcgU3RyaW5nCi0JCXJldHVybiBQcmVmZXJlbmNlVXRpbC5zZXJpYWxpemVEb2N1bWVudChkb2MpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRmVhdHVyZVByZWZlcmVuY2VzIGZyb21YTUwoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlGZWF0dXJlUHJlZmVyZW5jZXMgcHJlZnMgPSBuZXcgRmVhdHVyZVByZWZlcmVuY2VzKCk7Ci0KLQkJLy8gRG8gdGhlIHBhcnNpbmcgYW5kIG9idGFpbiB0aGUgdG9wLWxldmVsIG5vZGUKLQkJRG9jdW1lbnQgZG9jID0gUHJlZmVyZW5jZVV0aWwuZ2V0RG9jdW1lbnQoaW5wdXRTdHJlYW0pOwotCQlFbGVtZW50IGNvbmZpZyA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQotCQlNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBTdHJpbmc+PiB0eXBlRmVhdHVyZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIFN0cmluZz4+KCk7Ci0JCUVsZW1lbnRbXSBwcm9jZXNzb3JUeXBlRWxzID0gUHJlZmVyZW5jZVV0aWwuZ2V0Q2hpbGRFbGVtZW50cyhjb25maWcsICJwcm9jZXNzb3JUeXBlIik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvY2Vzc29yVHlwZUVscy5sZW5ndGg7ICsraSkKLQkJewotCQkJRWxlbWVudCBwcm9jZXNzb3JUeXBlRWwgPSBwcm9jZXNzb3JUeXBlRWxzW2ldOwotCQkJU3RyaW5nIHR5cGUgPSBlbGVtZW50QXNUeXBlKHByb2Nlc3NvclR5cGVFbCk7Ci0JCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGZlYXR1cmVWYWx1ZXMgPSBlbGVtZW50QXNGZWF0dXJlVmFsdWVzKHByb2Nlc3NvclR5cGVFbCk7Ci0JCQl0eXBlRmVhdHVyZXMucHV0KHR5cGUsIGZlYXR1cmVWYWx1ZXMpOwotCQl9Ci0KLQkJcHJlZnMuc2V0VHlwZUZlYXR1cmVzKHR5cGVGZWF0dXJlcyk7Ci0KLQkJcmV0dXJuIHByZWZzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBlbGVtZW50QXNUeXBlKEVsZW1lbnQgcGFyZW50KQotCXsKLQkJU3RyaW5nIGlkID0gcGFyZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsKLQkJcmV0dXJuIGlkOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEVsZW1lbnQgdHlwZUFzRWxlbWVudChEb2N1bWVudCBkb2MsIFN0cmluZyB0eXBlKQotCXsKLQkJRWxlbWVudCBlbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoInByb2Nlc3NvclR5cGUiKTsKLQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoImlkIiwgdHlwZSk7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZWxlbWVudEFzRmVhdHVyZVZhbHVlcyhFbGVtZW50IGVsZW1lbnQpCi0JewotCQlFbGVtZW50W10gZmVhdHVyZUVscyA9IFByZWZlcmVuY2VVdGlsLmdldENoaWxkRWxlbWVudHMoZWxlbWVudCwgImZlYXR1cmUiKTsKLQkJTWFwPFN0cmluZywgU3RyaW5nPiBmZWF0dXJlVmFsdWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KGZlYXR1cmVFbHMubGVuZ3RoKTsKLQkJZm9yIChFbGVtZW50IGZlYXR1cmVFbCA6IGZlYXR1cmVFbHMpCi0JCXsKLQkJCVN0cmluZyB1cmkgPSBmZWF0dXJlRWwuZ2V0QXR0cmlidXRlKCJ1cmkiKTsKLQkJCVN0cmluZyB2YWx1ZSA9IGZlYXR1cmVFbC5nZXRBdHRyaWJ1dGUoInZhbHVlIik7Ci0JCQlmZWF0dXJlVmFsdWVzLnB1dCh1cmksIHZhbHVlKTsKLQkJfQotCQlyZXR1cm4gZmVhdHVyZVZhbHVlczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZlYXR1cmVWYWx1ZXNBc0VsZW1lbnQoRG9jdW1lbnQgZG9jLCBFbGVtZW50IGZlYXR1cmVzRWwsIE1hcDxTdHJpbmcsIFN0cmluZz4gZmVhdHVyZVZhbHVlcykKLQl7Ci0JCWlmIChmZWF0dXJlVmFsdWVzICE9IG51bGwpCi0JCXsKLQkJCWZvciAoTWFwLkVudHJ5PFN0cmluZyxTdHJpbmc+IGVudHJ5MiA6IGZlYXR1cmVWYWx1ZXMuZW50cnlTZXQoKSkKLQkJCXsKLQkJCQlTdHJpbmcgdXJpID0gKFN0cmluZykgZW50cnkyLmdldEtleSgpOwotCQkJCVN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIGVudHJ5Mi5nZXRWYWx1ZSgpOwotCQkJCUVsZW1lbnQgZWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJmZWF0dXJlIik7Ci0JCQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoInVyaSIsIHVyaSk7Ci0JCQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoInZhbHVlIiwgdmFsdWUpOwotCQkJCWZlYXR1cmVzRWwuYXBwZW5kQ2hpbGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9MYXVuY2hpbmdQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL0xhdW5jaGluZ1BsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGNlODE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL0xhdW5jaGluZ1BsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXVuY2hpbmdQbHVnaW4gZXh0ZW5kcyBQbHVnaW4KLXsKLQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nIjsKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBMYXVuY2hpbmdQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIExhdW5jaGluZ1BsdWdpbigpCi0JewotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24KLQl7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICogCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBMYXVuY2hpbmdQbHVnaW4gZ2V0RGVmYXVsdCgpCi0JewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coRXhjZXB0aW9uIGUpCi0JewotCQlnZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCAwLCAiIiwgZSkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coQ29yZUV4Y2VwdGlvbiBlKQotCXsKLQkJZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhlLmdldFN0YXR1cygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9PdXRwdXRQcm9wZXJ0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvT3V0cHV0UHJvcGVydHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE5ZGYxZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9PdXRwdXRQcm9wZXJ0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5JT3V0cHV0UHJvcGVydHk7Ci0KLXB1YmxpYyBjbGFzcyBPdXRwdXRQcm9wZXJ0eSBpbXBsZW1lbnRzIElPdXRwdXRQcm9wZXJ0eQotewotCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZGVzYzsKLQotCXB1YmxpYyBPdXRwdXRQcm9wZXJ0eShTdHJpbmcga2V5LCBTdHJpbmcgZGVzYykKLQl7Ci0JCXRoaXMubmFtZSA9IGtleTsKLQkJdGhpcy5kZXNjID0gZGVzYzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkKLQl7Ci0JCXJldHVybiBkZXNjOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VVJJKCkKLQl7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvT3V0cHV0UHJvcGVydHlQcmVmZXJlbmNlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvT3V0cHV0UHJvcGVydHlQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTE2ZmE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL091dHB1dFByb3BlcnR5UHJlZmVyZW5jZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIE91dHB1dFByb3BlcnR5UHJlZmVyZW5jZXMKLXsKLQlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFByb3BlcnRpZXM+IHR5cGVQcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBQcm9wZXJ0aWVzPigpOwotCi0JcHVibGljIFByb3BlcnRpZXMgZ2V0T3V0cHV0UHJvcGVydHlWYWx1ZXMoU3RyaW5nIHR5cGVJZCkKLQl7Ci0JCXJldHVybiAoUHJvcGVydGllcykgdHlwZVByb3BlcnRpZXMuZ2V0KHR5cGVJZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T3V0cHV0UHJvcGVydHlWYWx1ZXMoU3RyaW5nIHR5cGVJZCwgUHJvcGVydGllcyBwcm9wZXJ0aWVzKQotCXsKLQkJdHlwZVByb3BlcnRpZXMucHV0KHR5cGVJZCwgcHJvcGVydGllcyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBc1hNTCgpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgVHJhbnNmb3JtZXJFeGNlcHRpb24KLQl7Ci0JCURvY3VtZW50IGRvYyA9IFByZWZlcmVuY2VVdGlsLmdldERvY3VtZW50KCk7Ci0JCUVsZW1lbnQgY29uZmlnID0gZG9jLmNyZWF0ZUVsZW1lbnQoIm91dHB1dFByb3BlcnR5UHJlZmVyZW5jZXMiKTsKLQkJZG9jLmFwcGVuZENoaWxkKGNvbmZpZyk7Ci0KLQkJZm9yIChTdHJpbmcgdHlwZSA6IHR5cGVQcm9wZXJ0aWVzLmtleVNldCgpKQotCQl7Ci0JCQlFbGVtZW50IHByb2Nlc3NvclR5cGVFbGVtZW50ID0gdHlwZUFzRWxlbWVudChkb2MsIHR5cGUpOwotCQkJUHJvcGVydGllcyBwcm9wZXJ0eVZhbHVlcyA9IChQcm9wZXJ0aWVzKSB0eXBlUHJvcGVydGllcy5nZXQodHlwZSk7Ci0JCQlmZWF0dXJlVmFsdWVzQXNFbGVtZW50KGRvYywgcHJvY2Vzc29yVHlwZUVsZW1lbnQsIHByb3BlcnR5VmFsdWVzKTsKLQkJCWNvbmZpZy5hcHBlbmRDaGlsZChwcm9jZXNzb3JUeXBlRWxlbWVudCk7Ci0JCX0KLQotCQkvLyBTZXJpYWxpemUgdGhlIERvY3VtZW50IGFuZCByZXR1cm4gdGhlIHJlc3VsdGluZyBTdHJpbmcKLQkJcmV0dXJuIFByZWZlcmVuY2VVdGlsLnNlcmlhbGl6ZURvY3VtZW50KGRvYyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBPdXRwdXRQcm9wZXJ0eVByZWZlcmVuY2VzIGZyb21YTUwoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlPdXRwdXRQcm9wZXJ0eVByZWZlcmVuY2VzIHByZWZzID0gbmV3IE91dHB1dFByb3BlcnR5UHJlZmVyZW5jZXMoKTsKLQotCQkvLyBEbyB0aGUgcGFyc2luZyBhbmQgb2J0YWluIHRoZSB0b3AtbGV2ZWwgbm9kZQotCQlEb2N1bWVudCBkb2MgPSBQcmVmZXJlbmNlVXRpbC5nZXREb2N1bWVudChpbnB1dFN0cmVhbSk7Ci0JCUVsZW1lbnQgY29uZmlnID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpOwotCi0JCUVsZW1lbnRbXSBwcm9jZXNzb3JUeXBlRWxzID0gUHJlZmVyZW5jZVV0aWwuZ2V0Q2hpbGRFbGVtZW50cyhjb25maWcsICJwcm9jZXNzb3JUeXBlIik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvY2Vzc29yVHlwZUVscy5sZW5ndGg7ICsraSkKLQkJewotCQkJRWxlbWVudCBwcm9jZXNzb3JUeXBlRWwgPSBwcm9jZXNzb3JUeXBlRWxzW2ldOwotCQkJU3RyaW5nIHR5cGUgPSBlbGVtZW50QXNUeXBlKHByb2Nlc3NvclR5cGVFbCk7Ci0JCQlQcm9wZXJ0aWVzIGZlYXR1cmVWYWx1ZXMgPSBlbGVtZW50QXNQcm9wZXJ0eVZhbHVlcyhwcm9jZXNzb3JUeXBlRWwpOwotCQkJcHJlZnMuc2V0T3V0cHV0UHJvcGVydHlWYWx1ZXModHlwZSwgZmVhdHVyZVZhbHVlcyk7Ci0JCX0KLQotCQlyZXR1cm4gcHJlZnM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGVsZW1lbnRBc1R5cGUoRWxlbWVudCBwYXJlbnQpCi0JewotCQlTdHJpbmcgaWQgPSBwYXJlbnQuZ2V0QXR0cmlidXRlKCJpZCIpOwotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRWxlbWVudCB0eXBlQXNFbGVtZW50KERvY3VtZW50IGRvYywgU3RyaW5nIHR5cGUpCi0JewotCQlFbGVtZW50IGVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgicHJvY2Vzc29yVHlwZSIpOwotCQllbGVtZW50LnNldEF0dHJpYnV0ZSgiaWQiLCB0eXBlKTsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgUHJvcGVydGllcyBlbGVtZW50QXNQcm9wZXJ0eVZhbHVlcyhFbGVtZW50IGVsZW1lbnQpCi0JewotCQlFbGVtZW50W10gcHJvcGVydHlFbHMgPSBQcmVmZXJlbmNlVXRpbC5nZXRDaGlsZEVsZW1lbnRzKGVsZW1lbnQsICJwcm9wZXJ0eSIpOwotCQlQcm9wZXJ0aWVzIHByb3BlcnR5VmFsdWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJZm9yIChFbGVtZW50IGZlYXR1cmVFbCA6IHByb3BlcnR5RWxzKQotCQl7Ci0JCQlTdHJpbmcgbmFtZSA9IGZlYXR1cmVFbC5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKLQkJCVN0cmluZyB2YWx1ZSA9IGZlYXR1cmVFbC5nZXRBdHRyaWJ1dGUoInZhbHVlIik7Ci0JCQlwcm9wZXJ0eVZhbHVlcy5wdXQobmFtZSwgdmFsdWUpOwotCQl9Ci0JCXJldHVybiBwcm9wZXJ0eVZhbHVlczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZlYXR1cmVWYWx1ZXNBc0VsZW1lbnQoRG9jdW1lbnQgZG9jLCBFbGVtZW50IGZlYXR1cmVzRWwsIFByb3BlcnRpZXMgcHJvcGVydHlWYWx1ZXMpCi0JewotCQlpZiAocHJvcGVydHlWYWx1ZXMgIT0gbnVsbCkKLQkJewotCQkJZm9yIChNYXAuRW50cnk8T2JqZWN0LE9iamVjdD4gZW50cnkyIDogcHJvcGVydHlWYWx1ZXMuZW50cnlTZXQoKSkKLQkJCXsKLQkJCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGVudHJ5Mi5nZXRLZXkoKTsKLQkJCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBlbnRyeTIuZ2V0VmFsdWUoKTsKLQkJCQlFbGVtZW50IGVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgicHJvcGVydHkiKTsKLQkJCQllbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZSIsIG5hbWUpOwotCQkJCWVsZW1lbnQuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIHZhbHVlKTsKLQkJCQlmZWF0dXJlc0VsLmFwcGVuZENoaWxkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvUGx1Z2luUHJvY2Vzc29ySmFyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9QbHVnaW5Qcm9jZXNzb3JKYXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJiMzFjZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9QbHVnaW5Qcm9jZXNzb3JKYXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLklQcm9jZXNzb3JKYXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotcHVibGljIGNsYXNzIFBsdWdpblByb2Nlc3NvckphciBpbXBsZW1lbnRzIElQcm9jZXNzb3JKYXIKLXsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBwbHVnaW5JZDsKLQlwcml2YXRlIGZpbmFsIElQYXRoIHBhdGg7Ci0KLQlwdWJsaWMgUGx1Z2luUHJvY2Vzc29ySmFyKFN0cmluZyBwbHVnaW5JZCwgSVBhdGggcGF0aCkKLQl7Ci0JCXRoaXMucGx1Z2luSWQgPSBwbHVnaW5JZDsKLQkJdGhpcy5wYXRoID0gcGF0aDsKLQl9Ci0KLQlwdWJsaWMgVVJMIGFzVVJMKCkKLQl7Ci0JCVVSTCB1cmwgPSBudWxsOwotCQl0cnkKLQkJewotCQkJLy8gRklYTUUgdmVyeSBjbHVtc3kgd2F5IHRvIGdldCBsb2NhdGlvbiBvcmJpdCBqYXIgZmlsZQotCQkJLy8gVGhlcmUgaXMgc3VyZWx5IGEgYmV0dGVyIHdheSwgYnV0IEkgY2FuJ2QgZmluZCBpdC4KLQkJCWlmIChwYXRoID09IG51bGwpCi0JCQl7Ci0JCQkJdXJsID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKS5nZXRFbnRyeSgiLyIpOwotCQkJCXVybCA9IEZpbGVMb2NhdG9yLnJlc29sdmUodXJsKTsKLQkJCQlTdHJpbmcgcyA9IHVybC5nZXRQYXRoKCk7Ci0JCQkJaWYgKHMuZW5kc1dpdGgoIiEvIikpCi0JCQkJewotCQkJCQlzID0gcy5zdWJzdHJpbmcoMCxzLmxlbmd0aCgpLTIpOwotCQkJCX0KLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4ocyk7Ci0JCQkJdXJsID0gbmV3IFVSTChzKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJCQlJUGF0aCBqYXJQYXRoID0gbmV3IFBhdGgoIi8iICsgcGF0aCk7Ci0JCQkJdXJsID0gRmlsZUxvY2F0b3IuZmluZChidW5kbGUsIGphclBhdGgsIG51bGwpOwotCQkJCWlmICh1cmwgIT0gbnVsbCkKLQkJCQkJdXJsID0gRmlsZUxvY2F0b3IucmVzb2x2ZSh1cmwpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKQotCQl7Ci0JCQlMYXVuY2hpbmdQbHVnaW4ubG9nKGUpOwotCQl9Ci0JCXJldHVybiB1cmw7Ci0JfQotCi0JcHVibGljIElQYXRoIGdldFBhdGgoKQotCXsKLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlyZXR1cm4gIlBsdWdpbiAiICsgcGx1Z2luSWQgKyAiLCBwYXRoICIgKyBwYXRoOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYzUwN2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkRlZmF1bHRTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSUVjbGlwc2VQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5YU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLlhTTFRSdW50aW1lOwotCi0vKioKLSAqIENsYXNzIHVzZWQgdG8gaW5pdGlhbGl6ZSBkZWZhdWx0IHByZWZlcmVuY2UgdmFsdWVzLgotICovCi1wdWJsaWMgY2xhc3MgUHJlZmVyZW5jZUluaXRpYWxpemVyIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIKLXsKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKQotCXsKLQkJSUVjbGlwc2VQcmVmZXJlbmNlcyBub2RlID0gbmV3IERlZmF1bHRTY29wZSgpLmdldE5vZGUoTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCk7Ci0KLQkJUHJvY2Vzc29yUHJlZmVyZW5jZXMgcHJlZnMgPSBuZXcgUHJvY2Vzc29yUHJlZmVyZW5jZXMoKTsKLQkJcHJlZnMuc2V0RGVmYXVsdFByb2Nlc3NvcklkKFhTTFRSdW50aW1lLkpSRV9ERUZBVUxUX1BST0NFU1NPUl9JRCk7Ci0KLQkJT3V0cHV0UHJvcGVydHlQcmVmZXJlbmNlcyBvdXRwdXRQcmVmcyA9IG5ldyBPdXRwdXRQcm9wZXJ0eVByZWZlcmVuY2VzKCk7Ci0JCW91dHB1dFByZWZzLnNldE91dHB1dFByb3BlcnR5VmFsdWVzKFhTTFRSdW50aW1lLkpSRV9ERUZBVUxUX1BST0NFU1NPUl9UWVBFX0lELCBYU0xUUnVudGltZS5jcmVhdGVEZWZhdWx0T3V0cHV0UHJvcGVydGllcyhYU0xUUnVudGltZS5KUkVfREVGQVVMVF9QUk9DRVNTT1JfVFlQRV9JRCkpOwotCQlvdXRwdXRQcmVmcy5zZXRPdXRwdXRQcm9wZXJ0eVZhbHVlcyhYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLlhBTEFOX1RZUEVfSUQsIFhTTFRSdW50aW1lLmNyZWF0ZURlZmF1bHRPdXRwdXRQcm9wZXJ0aWVzKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuWEFMQU5fVFlQRV9JRCkpOwotCQlvdXRwdXRQcmVmcy5zZXRPdXRwdXRQcm9wZXJ0eVZhbHVlcyhYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLlNBWE9OQl9UWVBFX0lELCBYU0xUUnVudGltZS5jcmVhdGVEZWZhdWx0T3V0cHV0UHJvcGVydGllcyhYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLlNBWE9OQl9UWVBFX0lEKSk7Ci0KLQkJdHJ5Ci0JCXsKLQkJCVN0cmluZyB4bWwgPSBwcmVmcy5nZXRBc1hNTCgpOwotCQkJbm9kZS5wdXQoWFNMVFJ1bnRpbWUuUFJFRl9QUk9DRVNTT1JfWE1MLCB4bWwpOwotCi0JCQl4bWwgPSBvdXRwdXRQcmVmcy5nZXRBc1hNTCgpOwotCQkJbm9kZS5wdXQoWFNMVFJ1bnRpbWUuUFJFRl9PVVRQVVRfUFJPUEVSVElFU19YTUwsIHhtbCk7Ci0KLQkJCW5vZGUucHV0KFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9ERUZBVUxUX0RFQlVHR0lOR19JTlNUQUxMX0lELCAib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcueGFsYW4uMl83XzAiKTsKLQkJfQotCQljYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKQotCQl7Ci0JCQlMYXVuY2hpbmdQbHVnaW4ubG9nKGUpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKQotCQl7Ci0JCQlMYXVuY2hpbmdQbHVnaW4ubG9nKGUpOwotCQl9Ci0JCWNhdGNoIChUcmFuc2Zvcm1lckV4Y2VwdGlvbiBlKQotCQl7Ci0JCQlMYXVuY2hpbmdQbHVnaW4ubG9nKGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvUHJlZmVyZW5jZVV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL1ByZWZlcmVuY2VVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZjFiYTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvUHJlZmVyZW5jZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZzsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uT3V0cHV0S2V5czsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi1wdWJsaWMgY2xhc3MgUHJlZmVyZW5jZVV0aWwKLXsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVDb3JlRXhjZXB0aW9uKFRocm93YWJsZSBlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lELCAwLCBlLmdldE1lc3NhZ2UoKSwgZSkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotCXsKLQkJRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkJRG9jdW1lbnRCdWlsZGVyIGRvY0J1aWxkZXIgPSBkZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLQkJRG9jdW1lbnQgZG9jID0gZG9jQnVpbGRlci5uZXdEb2N1bWVudCgpOwotCQlyZXR1cm4gZG9jOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcmlhbGl6ZURvY3VtZW50KERvY3VtZW50IGRvYykgdGhyb3dzIElPRXhjZXB0aW9uLCBUcmFuc2Zvcm1lckV4Y2VwdGlvbgotCXsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHMgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0KLQkJVHJhbnNmb3JtZXJGYWN0b3J5IGZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkJVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSBmYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7Ci0JCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuTUVUSE9ELCAieG1sIik7IAotCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLklOREVOVCwgInllcyIpOyAKLQotCQlET01Tb3VyY2Ugc291cmNlID0gbmV3IERPTVNvdXJjZShkb2MpOwotCQlTdHJlYW1SZXN1bHQgb3V0cHV0VGFyZ2V0ID0gbmV3IFN0cmVhbVJlc3VsdChzKTsKLQkJdHJhbnNmb3JtZXIudHJhbnNmb3JtKHNvdXJjZSwgb3V0cHV0VGFyZ2V0KTsKLQotCQlyZXR1cm4gcy50b1N0cmluZygiVVRGOCIpOyAJCQkKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEVsZW1lbnRbXSBnZXRDaGlsZEVsZW1lbnRzKEVsZW1lbnQgcGFyZW50LCBTdHJpbmcgbmFtZSkKLQl7Ci0JCUxpc3Q8RWxlbWVudD4gY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PEVsZW1lbnQ+KCk7Ci0JCU5vZGVMaXN0IGxpc3QgPSBwYXJlbnQuZ2V0Q2hpbGROb2RlcygpOwotCQlpbnQgbGVuZ3RoID0gbGlzdC5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkKLQkJewotCQkJTm9kZSBub2RlID0gbGlzdC5pdGVtKGkpOwotCQkJc2hvcnQgdHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJCWlmICh0eXBlID09IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJewotCQkJCUVsZW1lbnQgcHJvY2Vzc29yRWxlbWVudCA9IChFbGVtZW50KSBub2RlOwotCQkJCWlmIChwcm9jZXNzb3JFbGVtZW50LmdldE5vZGVOYW1lKCkuZXF1YWxzKG5hbWUpKQotCQkJCXsKLQkJCQkJY2hpbGRyZW4uYWRkKHByb2Nlc3NvckVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gKEVsZW1lbnRbXSkgY2hpbGRyZW4udG9BcnJheShuZXcgRWxlbWVudFswXSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Tm9kZVRleHQoTm9kZSBub2RlKQotCXsKLQkJc3dpdGNoIChub2RlLmdldE5vZGVUeXBlKCkpCi0JCXsKLQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREU6Ci0JCQkJTm9kZUxpc3QgY2hpbGROb2RlcyA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkTm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykKLQkJCQl7Ci0JCQkJCU5vZGUgY2hpbGQgPSBjaGlsZE5vZGVzLml0ZW0oaSk7Ci0JCQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKQotCQkJCQl7Ci0JCQkJCQlzYi5hcHBlbmQoY2hpbGQuZ2V0Tm9kZVZhbHVlKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBzYi50b1N0cmluZygpOwotCQkJY2FzZSBOb2RlLlRFWFRfTk9ERToKLQkJCWNhc2UgTm9kZS5BVFRSSUJVVEVfTk9ERToKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIG5vZGUuZ2V0Tm9kZVZhbHVlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIERvY3VtZW50IGdldERvY3VtZW50KElucHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCURvY3VtZW50IGRvYyA9IG51bGw7Ci0JCXRyeQotCQl7Ci0JCQlEb2N1bWVudEJ1aWxkZXIgcGFyc2VyID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpOwotCQkJcGFyc2VyLnNldEVycm9ySGFuZGxlcihuZXcgRGVmYXVsdEhhbmRsZXIoKSk7Ci0JCQlkb2MgPSBwYXJzZXIucGFyc2UobmV3IElucHV0U291cmNlKHN0cmVhbSkpOwotCQl9Ci0JCWNhdGNoIChTQVhFeGNlcHRpb24gZSkKLQkJewotCQkJUHJlZmVyZW5jZVV0aWwuY3JlYXRlQ29yZUV4Y2VwdGlvbihlKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkKLQkJewotCQkJUHJlZmVyZW5jZVV0aWwuY3JlYXRlQ29yZUV4Y2VwdGlvbihlKTsKLQkJfQotCQljYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKQotCQl7Ci0JCQlQcmVmZXJlbmNlVXRpbC5jcmVhdGVDb3JlRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWNhdGNoIChGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIGUpCi0JCXsKLQkJCVByZWZlcmVuY2VVdGlsLmNyZWF0ZUNvcmVFeGNlcHRpb24oZSk7Ci0JCX0KLQkJZmluYWxseQotCQl7Ci0JCQl0cnkKLQkJCXsKLQkJCQlzdHJlYW0uY2xvc2UoKTsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKQotCQkJewotCQkJCVByZWZlcmVuY2VVdGlsLmNyZWF0ZUNvcmVFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRvYzsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9Qcm9jZXNzb3JJbnZva2VyRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvUHJvY2Vzc29ySW52b2tlckRlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdmMzBiYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9Qcm9jZXNzb3JJbnZva2VyRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLklQcm9jZXNzb3JJbnZva2VyOwotCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc29ySW52b2tlckRlc2NyaXB0b3IgaW1wbGVtZW50cyBJUHJvY2Vzc29ySW52b2tlcgotewotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaW52b2tlckNsYXNzOwotCXByaXZhdGUgZmluYWwgU3RyaW5nW10gY2xhc3NwYXRoOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGlkOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGJ1bmRsZUlkOwotCi0JcHVibGljIFByb2Nlc3Nvckludm9rZXJEZXNjcmlwdG9yKFN0cmluZyBpZCwgU3RyaW5nIGJ1bmRsZUlkLCBTdHJpbmcgaW52b2tlckNsYXNzLCBTdHJpbmdbXSBjbGFzc3BhdGgpCi0JewotCQl0aGlzLmlkID0gaWQ7Ci0JCXRoaXMuYnVuZGxlSWQgPSBidW5kbGVJZDsKLQkJdGhpcy5pbnZva2VyQ2xhc3MgPSBpbnZva2VyQ2xhc3M7Ci0JCXRoaXMuY2xhc3NwYXRoID0gY2xhc3NwYXRoOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRDbGFzc3BhdGhFbnRyaWVzKCkKLQl7Ci0JCUxpc3Q8U3RyaW5nPiBlbnRyaWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXRyeSB7Ci0JCQkvLyBpZiBpbiBkZXYgbW9kZSwgdXNlIHRoZSBiaW4gZGlyCi0JCQlpZiAoUGxhdGZvcm0uaW5EZXZlbG9wbWVudE1vZGUoKSkKLQkJCQllbnRyaWVzLmFkZChVdGlscy5nZXRGaWxlTG9jYXRpb24oYnVuZGxlSWQsICIvYmluIikpOwotCQkJZm9yIChpbnQgaT0wO2kgPGNsYXNzcGF0aC5sZW5ndGg7aSsrKSAKLQkJCXsKLQkJCQlTdHJpbmcgc3RyaW5nID0gY2xhc3NwYXRoW2ldOwotCQkJCVN0cmluZyBlbnRyeTsKLQkJCQlpZiAoc3RyaW5nLnN0YXJ0c1dpdGgoIiR7ZWNsaXBzZV9vcmJpdDoiKSAmJiBzdHJpbmcuZW5kc1dpdGgoIn0iKSkKLQkJCQl7Ci0JCQkJCXN0cmluZyA9IHN0cmluZy5zdWJzdHJpbmcoIiR7ZWNsaXBzZV9vcmJpdDoiLmxlbmd0aCgpKTsKLQkJCQkJc3RyaW5nID0gc3RyaW5nLnN1YnN0cmluZygwLHN0cmluZy5sZW5ndGgoKS0xKTsKLQkJCQkJZW50cnkgPSBVdGlscy5nZXRGaWxlTG9jYXRpb24oc3RyaW5nLCIiKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJZW50cnkgPSBVdGlscy5nZXRGaWxlTG9jYXRpb24oYnVuZGxlSWQsc3RyaW5nKTsKLQkJCQl9Ci0JCQkJaWYgKGVudHJ5IT1udWxsKQotCQkJCQllbnRyaWVzLmFkZChlbnRyeSk7Ci0JCQl9Ci0JCX0gCi0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIAotCQl7Ci0JCQlMYXVuY2hpbmdQbHVnaW4ubG9nKGUpOwotCQl9Ci0JCXJldHVybiBlbnRyaWVzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyBJUHJvY2Vzc29ySW52b2tlcgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW52b2tlckNsYXNzTmFtZSgpCi0JewotCQlyZXR1cm4gaW52b2tlckNsYXNzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKQotCXsKLQkJcmV0dXJuIGlkOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL1Byb2Nlc3Nvckphci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvUHJvY2Vzc29ySmFyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMWMxN2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvUHJvY2Vzc29ySmFyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZzsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5JUHJvY2Vzc29ySmFyOwotCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc29ySmFyIGltcGxlbWVudHMgSVByb2Nlc3NvckphcgotewotCXByaXZhdGUgZmluYWwgSVBhdGggcGF0aDsKLQotCXB1YmxpYyBQcm9jZXNzb3JKYXIoSVBhdGggcGF0aCkKLQl7Ci0JCXRoaXMucGF0aCA9IHBhdGg7Ci0JfQotCi0JcHVibGljIFVSTCBhc1VSTCgpCi0JewotCQlVUkwgdXJsID0gbnVsbDsKLQkJdHJ5Ci0JCXsKLQkJCS8vIGZpcnN0IHRyeSB0byByZXNvbHZlIGFzIHdvcmtzcGFjZS1yZWxhdGl2ZSBwYXRoCi0JCQlJUGF0aCByb290UGF0aCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKTsKLQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHJvb3RQYXRoLmFwcGVuZChwYXRoKS50b09TU3RyaW5nKCkpOwotCQkJaWYgKGZpbGUuZXhpc3RzKCkpCi0JCQkJdXJsID0gZmlsZS50b1VSTCgpOwotCQkJZWxzZQotCQkJewotCQkJCS8vIG5vdyB0cnkgdG8gcmVzb2x2ZSBhcyBhbiBhYnNvbHV0ZSBwYXRoCi0JCQkJZmlsZSA9IG5ldyBGaWxlKHBhdGgudG9PU1N0cmluZygpKTsKLQkJCQl1cmwgPSBmaWxlLnRvVVJMKCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQlMYXVuY2hpbmdQbHVnaW4ubG9nKGUpOwotCQl9Ci0JCXJldHVybiB1cmw7Ci0JfQotCi0JcHVibGljIElQYXRoIGdldFBhdGgoKQotCXsKLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlyZXR1cm4gcGF0aC50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL1Byb2Nlc3NvclByZWZlcmVuY2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9Qcm9jZXNzb3JQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjliZDFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL1Byb2Nlc3NvclByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmc7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5JUHJvY2Vzc29ySW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5JUHJvY2Vzc29ySmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLlByb2Nlc3Nvckluc3RhbGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBQcm9jZXNzb3JQcmVmZXJlbmNlcwotewotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRQcm9jZXNzb3JJZDsKLQlwcml2YXRlIExpc3Q8SVByb2Nlc3Nvckluc3RhbGw+IHByb2Nlc3NvcnMgPSBuZXcgQXJyYXlMaXN0PElQcm9jZXNzb3JJbnN0YWxsPigpOwotCi0JcHVibGljIHZvaWQgc2V0UHJvY2Vzc29ycyhMaXN0PElQcm9jZXNzb3JJbnN0YWxsPiBwcm9jZXNzb3JzKQotCXsKLQkJdGhpcy5wcm9jZXNzb3JzID0gcHJvY2Vzc29yczsKLQl9Ci0KLQlwdWJsaWMgTGlzdDxJUHJvY2Vzc29ySW5zdGFsbD4gZ2V0UHJvY2Vzc29ycygpCi0JewotCQlyZXR1cm4gcHJvY2Vzc29yczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRQcm9jZXNzb3JJZCgpCi0JewotCQlyZXR1cm4gZGVmYXVsdFByb2Nlc3NvcklkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRQcm9jZXNzb3JJZChTdHJpbmcgZGVmYXVsdFByb2Nlc3NvcklkKQotCXsKLQkJdGhpcy5kZWZhdWx0UHJvY2Vzc29ySWQgPSBkZWZhdWx0UHJvY2Vzc29ySWQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBc1hNTCgpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgVHJhbnNmb3JtZXJFeGNlcHRpb24KLQl7Ci0JCURvY3VtZW50IGRvYyA9IFByZWZlcmVuY2VVdGlsLmdldERvY3VtZW50KCk7Ci0JCUVsZW1lbnQgY29uZmlnID0gZG9jLmNyZWF0ZUVsZW1lbnQoInByb2Nlc3NvclNldHRpbmdzIik7IAotCQlkb2MuYXBwZW5kQ2hpbGQoY29uZmlnKTsKLQotCQkvLyBTZXQgdGhlIGRlZmF1bHRWTSBhdHRyaWJ1dGUgb24gdGhlIHRvcC1sZXZlbCBub2RlCi0JCWlmIChkZWZhdWx0UHJvY2Vzc29ySWQgIT0gbnVsbCkKLQkJewotCQkJY29uZmlnLnNldEF0dHJpYnV0ZSgiZGVmYXVsdFByb2Nlc3NvciIsIGRlZmF1bHRQcm9jZXNzb3JJZCk7IAotCQl9Ci0KLQkJZm9yIChJdGVyYXRvcjxJUHJvY2Vzc29ySW5zdGFsbD4gaXRlciA9IHByb2Nlc3NvcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotCQl7Ci0JCQlJUHJvY2Vzc29ySW5zdGFsbCBpbnN0YWxsID0gKElQcm9jZXNzb3JJbnN0YWxsKSBpdGVyLm5leHQoKTsKLQkJCWlmICghaW5zdGFsbC5pc0NvbnRyaWJ1dGVkKCkpCi0JCQl7Ci0JCQkJRWxlbWVudCB2bVR5cGVFbGVtZW50ID0gaW5zdGFsbEFzRWxlbWVudChkb2MsIGluc3RhbGwpOwotCQkJCWNvbmZpZy5hcHBlbmRDaGlsZCh2bVR5cGVFbGVtZW50KTsKLQkJCX0KLQkJfQotCi0JCS8vIFNlcmlhbGl6ZSB0aGUgRG9jdW1lbnQgYW5kIHJldHVybiB0aGUgcmVzdWx0aW5nIFN0cmluZwotCQlyZXR1cm4gUHJlZmVyZW5jZVV0aWwuc2VyaWFsaXplRG9jdW1lbnQoZG9jKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFByb2Nlc3NvclByZWZlcmVuY2VzIGZyb21YTUwoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlQcm9jZXNzb3JQcmVmZXJlbmNlcyBwcmVmcyA9IG5ldyBQcm9jZXNzb3JQcmVmZXJlbmNlcygpOwotCi0JCURvY3VtZW50IGRvYyA9IFByZWZlcmVuY2VVdGlsLmdldERvY3VtZW50KGlucHV0U3RyZWFtKTsKLQkJRWxlbWVudCBjb25maWcgPSBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0KLQkJLy8gUG9wdWxhdGUgdGhlIGRlZmF1bHQgVk0tcmVsYXRlZCBmaWVsZHMKLQkJcHJlZnMuc2V0RGVmYXVsdFByb2Nlc3NvcklkKGNvbmZpZy5nZXRBdHRyaWJ1dGUoImRlZmF1bHRQcm9jZXNzb3IiKSk7Ci0KLQkJTGlzdDxJUHJvY2Vzc29ySW5zdGFsbD4gcHJvY2Vzc29ycyA9IG5ldyBBcnJheUxpc3Q8SVByb2Nlc3Nvckluc3RhbGw+KCk7Ci0JCS8vIFRyYXZlcnNlIHRoZSBwYXJzZWQgc3RydWN0dXJlIGFuZCBwb3B1bGF0ZSB0aGUgVk1UeXBlIHRvIFZNIE1hcAotCQlFbGVtZW50W10gcHJvY2Vzc29yRWxzID0gUHJlZmVyZW5jZVV0aWwuZ2V0Q2hpbGRFbGVtZW50cyhjb25maWcsICJwcm9jZXNzb3IiKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9jZXNzb3JFbHMubGVuZ3RoOyArK2kpCi0JCXsKLQkJCUlQcm9jZXNzb3JJbnN0YWxsIHByb2Nlc3NvciA9IGVsZW1lbnRBc0luc3RhbGwocHJvY2Vzc29yRWxzW2ldKTsKLQkJCXByb2Nlc3NvcnMuYWRkKHByb2Nlc3Nvcik7Ci0JCX0KLQotCQlwcmVmcy5zZXRQcm9jZXNzb3JzKHByb2Nlc3NvcnMpOwotCi0JCXJldHVybiBwcmVmczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJUHJvY2Vzc29ySW5zdGFsbCBlbGVtZW50QXNJbnN0YWxsKEVsZW1lbnQgcGFyZW50KQotCXsKLQkJU3RyaW5nIGlkID0gcGFyZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsKLQkJU3RyaW5nIGxhYmVsID0gcGFyZW50LmdldEF0dHJpYnV0ZSgibGFiZWwiKTsKLQkJU3RyaW5nIHR5cGVJZCA9IHBhcmVudC5nZXRBdHRyaWJ1dGUoInR5cGUiKTsKLQkJU3RyaW5nIHN1cHBvcnRzID0gcGFyZW50LmdldEF0dHJpYnV0ZSgic3VwcG9ydHMiKTsKLQkJU3RyaW5nIGRlYnVnZ2VySWQgPSBwYXJlbnQuZ2V0QXR0cmlidXRlKCJkZWJ1Z2dlcklkIik7Ci0KLQkJSVByb2Nlc3NvckphcltdIGphcnMgPSBudWxsOwotCQlFbGVtZW50W10gamFyc0VscyA9IFByZWZlcmVuY2VVdGlsLmdldENoaWxkRWxlbWVudHMocGFyZW50LCAiamFycyIpOwotCQlpZiAoamFyc0Vscy5sZW5ndGggPT0gMSkKLQkJewotCQkJamFycyA9IGVsZW1lbnRBc0phcnMoamFyc0Vsc1swXSk7Ci0JCX0KLQkJSVByb2Nlc3Nvckluc3RhbGwgaW5zdGFsbCA9IG5ldyBQcm9jZXNzb3JJbnN0YWxsKGlkLCBsYWJlbCwgdHlwZUlkLCBqYXJzLCBkZWJ1Z2dlcklkLCBzdXBwb3J0cywgZmFsc2UpOwotCQlyZXR1cm4gaW5zdGFsbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBFbGVtZW50IGluc3RhbGxBc0VsZW1lbnQoRG9jdW1lbnQgZG9jLCBJUHJvY2Vzc29ySW5zdGFsbCBpbnN0YWxsKQotCXsKLQkJRWxlbWVudCBlbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoInByb2Nlc3NvciIpOwotCQllbGVtZW50LnNldEF0dHJpYnV0ZSgiaWQiLCBpbnN0YWxsLmdldElkKCkpOwotCQllbGVtZW50LnNldEF0dHJpYnV0ZSgibGFiZWwiLCBpbnN0YWxsLmdldE5hbWUoKSk7Ci0JCWVsZW1lbnQuc2V0QXR0cmlidXRlKCJ0eXBlIiwgaW5zdGFsbC5nZXRQcm9jZXNzb3JUeXBlKCkuZ2V0SWQoKSk7Ci0JCWVsZW1lbnQuc2V0QXR0cmlidXRlKCJzdXBwb3J0cyIsIGluc3RhbGwuZ2V0U3VwcG9ydHMoKSk7Ci0JCWVsZW1lbnQuc2V0QXR0cmlidXRlKCJkZWJ1Z2dlcklkIiwgaW5zdGFsbC5nZXREZWJ1Z2dlcigpICE9IG51bGwgPyBpbnN0YWxsLmdldERlYnVnZ2VyKCkuZ2V0SWQoKSA6IG51bGwpOwotCQllbGVtZW50LmFwcGVuZENoaWxkKGphcnNBc0VsZW1lbnQoZG9jLCBpbnN0YWxsLmdldFByb2Nlc3NvckphcnMoKSkpOwotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJUHJvY2Vzc29ySmFyW10gZWxlbWVudEFzSmFycyhFbGVtZW50IGVsZW1lbnQpCi0JewotCQlFbGVtZW50W10gamFyRWxzID0gUHJlZmVyZW5jZVV0aWwuZ2V0Q2hpbGRFbGVtZW50cyhlbGVtZW50LCAiamFyIik7Ci0JCUxpc3Q8UHJvY2Vzc29ySmFyPiBqYXJzID0gbmV3IEFycmF5TGlzdDxQcm9jZXNzb3JKYXI+KGphckVscy5sZW5ndGgpOwotCQlmb3IgKEVsZW1lbnQgamFyRWwgOiBqYXJFbHMpCi0JCXsKLQkJCU5vZGUgbm9kZSA9IGphckVsLmdldEZpcnN0Q2hpbGQoKTsKLQkJCWlmIChub2RlICE9IG51bGwgJiYgbm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKQotCQkJewotCQkJCVN0cmluZyBwYXRoID0gKChUZXh0KSBub2RlKS5nZXROb2RlVmFsdWUoKTsKLQkJCQlqYXJzLmFkZChuZXcgUHJvY2Vzc29ySmFyKFBhdGguZnJvbVBvcnRhYmxlU3RyaW5nKHBhdGgpKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChJUHJvY2Vzc29ySmFyW10pIGphcnMudG9BcnJheShuZXcgSVByb2Nlc3NvckphclswXSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRWxlbWVudCBqYXJzQXNFbGVtZW50KERvY3VtZW50IGRvYywgSVByb2Nlc3NvckphcltdIGphcnMpCi0JewotCQlFbGVtZW50IGphcnNFbCA9IGRvYy5jcmVhdGVFbGVtZW50KCJqYXJzIik7IAotCQlmb3IgKElQcm9jZXNzb3JKYXIgamFyIDogamFycykKLQkJewotCQkJaWYgKGphciAhPSBudWxsICYmIGphci5nZXRQYXRoKCkgIT0gbnVsbCkKLQkJCXsKLQkJCQlFbGVtZW50IGphckVsID0gZG9jLmNyZWF0ZUVsZW1lbnQoImphciIpOwotCQkJCVRleHQgdGV4dCA9IGRvYy5jcmVhdGVUZXh0Tm9kZShqYXIuZ2V0UGF0aCgpLnRvUG9ydGFibGVTdHJpbmcoKSk7Ci0JCQkJamFyRWwuYXBwZW5kQ2hpbGQodGV4dCk7Ci0JCQkJamFyc0VsLmFwcGVuZENoaWxkKGphckVsKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gamFyc0VsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL1Byb2Nlc3NvclR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL1Byb2Nlc3NvclR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NjYmEyNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9Qcm9jZXNzb3JUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmc7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLklGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLklPdXRwdXRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5JUHJvY2Vzc29yVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5YU0xUUnVudGltZTsKLQotcHVibGljIGNsYXNzIFByb2Nlc3NvclR5cGUgaW1wbGVtZW50cyBJUHJvY2Vzc29yVHlwZQotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDX1NVRkZJWCA9ICIuREVTQyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfU1VGRklYID0gIi5UWVBFIjsKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIGlkOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdHJhbnNGYWN0b3J5TmFtZTsKLQlwcml2YXRlIGZpbmFsIFVSTCBmZWF0dXJlUHJvcGVydGllc1VSTDsKLQlwcml2YXRlIGZpbmFsIFVSTCBvdXRwdXRQcm9wZXJ0aWVzVVJMOwotCi0JcHJpdmF0ZSBJRmVhdHVyZVtdIGZlYXR1cmVzOwotCXByaXZhdGUgSU91dHB1dFByb3BlcnR5W10gb3V0cHV0UHJvcGVydGllczsKLQlwcml2YXRlIFByb3BlcnRpZXMgb3V0cHV0UHJvcGVydHlWYWx1ZXM7Ci0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGZlYXR1cmVWYWx1ZXM7Ci0KLQlwdWJsaWMgUHJvY2Vzc29yVHlwZShTdHJpbmcgaWQsIFN0cmluZyBuYW1lLCBVUkwgZmVhdHVyZVByb3BlcnRpZXNVUkwsIFVSTCBvdXRwdXRQcm9wZXJ0aWVzVVJMLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGZlYXR1cmVWYWx1ZXMsIFByb3BlcnRpZXMgb3V0cHV0UHJvcGVydHlWYWx1ZXMsIFN0cmluZyB0cmFuc0ZhY3RvcnlOYW1lKQotCXsKLQkJdGhpcy5pZCA9IGlkOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmZlYXR1cmVQcm9wZXJ0aWVzVVJMID0gZmVhdHVyZVByb3BlcnRpZXNVUkw7Ci0JCXRoaXMub3V0cHV0UHJvcGVydGllc1VSTCA9IG91dHB1dFByb3BlcnRpZXNVUkw7Ci0JCXRoaXMuZmVhdHVyZVZhbHVlcyA9IGZlYXR1cmVWYWx1ZXM7Ci0JCXRoaXMudHJhbnNGYWN0b3J5TmFtZSA9IHRyYW5zRmFjdG9yeU5hbWU7Ci0JCXRoaXMub3V0cHV0UHJvcGVydHlWYWx1ZXMgPSBvdXRwdXRQcm9wZXJ0eVZhbHVlczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkKLQl7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkKLQl7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCXB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldEZlYXR1cmVWYWx1ZXMoKQotCXsKLQkJcmV0dXJuIGZlYXR1cmVWYWx1ZXM7Ci0JfQotCi0JcHVibGljIElGZWF0dXJlW10gZ2V0RmVhdHVyZXMoKQotCXsKLQkJaWYgKGZlYXR1cmVzID09IG51bGwpCi0JCXsKLQkJCWlmIChmZWF0dXJlUHJvcGVydGllc1VSTCAhPSBudWxsKQotCQkJCWZlYXR1cmVzID0gbG9hZEZlYXR1cmVzKCk7Ci0JCQllbHNlCi0JCQkJZmVhdHVyZXMgPSBuZXcgSUZlYXR1cmVbMF07Ci0JCX0KLQkJcmV0dXJuIGZlYXR1cmVzOwotCX0KLQotCXB1YmxpYyBQcm9wZXJ0aWVzIGdldE91dHB1dFByb3BlcnR5VmFsdWVzKCkKLQl7Ci0JCXJldHVybiBvdXRwdXRQcm9wZXJ0eVZhbHVlczsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0pSRURlZmF1bHQoKQotCXsKLQkJcmV0dXJuIFhTTFRSdW50aW1lLkpSRV9ERUZBVUxUX1BST0NFU1NPUl9UWVBFX0lELmVxdWFscyhpZCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUcmFuc2Zvcm1lckZhY3RvcnlOYW1lKCkKLQl7Ci0JCXJldHVybiB0cmFuc0ZhY3RvcnlOYW1lOwotCX0KLQotCXB1YmxpYyBJT3V0cHV0UHJvcGVydHlbXSBnZXRPdXRwdXRQcm9wZXJ0aWVzKCkKLQl7Ci0JCWlmIChvdXRwdXRQcm9wZXJ0aWVzID09IG51bGwpCi0JCXsKLQkJCWlmIChvdXRwdXRQcm9wZXJ0aWVzVVJMICE9IG51bGwpCi0JCQkJb3V0cHV0UHJvcGVydGllcyA9IGxvYWRPdXRwdXRQcm9wZXJ0aWVzKCk7Ci0JCQllbHNlCi0JCQkJb3V0cHV0UHJvcGVydGllcyA9IG5ldyBJT3V0cHV0UHJvcGVydHlbMF07Ci0JCX0KLQkJcmV0dXJuIG91dHB1dFByb3BlcnRpZXM7Ci0JfQotCi0JcHJpdmF0ZSBJT3V0cHV0UHJvcGVydHlbXSBsb2FkT3V0cHV0UHJvcGVydGllcygpCi0JewotCQlCdWZmZXJlZElucHV0U3RyZWFtIGlzID0gbnVsbDsKLQkJTGlzdDxPdXRwdXRQcm9wZXJ0eT4gb3V0cHV0cyA9IG5ldyBBcnJheUxpc3Q8T3V0cHV0UHJvcGVydHk+KCk7Ci0JCVByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotCQl0cnkKLQkJewotCi0JCQlpcyA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG91dHB1dFByb3BlcnRpZXNVUkwub3BlblN0cmVhbSgpKTsKLQkJCXByb3BzLmxvYWQoaXMpOwotCQkJZm9yIChPYmplY3QgZWxlbWVudCA6IHByb3BzLmtleVNldCgpKQotCQkJewotCQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBlbGVtZW50OwotCQkJCWlmICgha2V5LmVuZHNXaXRoKERFU0NfU1VGRklYKSkKLQkJCQl7Ci0JCQkJCVN0cmluZyBuYW1lID0ga2V5OwotCQkJCQlTdHJpbmcgdXJpID0gcHJvcHMuZ2V0UHJvcGVydHkoa2V5KTsKLQkJCQkJU3RyaW5nIGRlc2MgPSBwcm9wcy5nZXRQcm9wZXJ0eShrZXkgKyBERVNDX1NVRkZJWCk7Ci0JCQkJCWlmICh1cmkgIT0gbnVsbCAmJiBuYW1lICE9IG51bGwgJiYgZGVzYyAhPSBudWxsKQotCQkJCQl7Ci0JCQkJCQlPdXRwdXRQcm9wZXJ0eSBwcm9wID0gbmV3IE91dHB1dFByb3BlcnR5KHVyaS50cmltKCksIGRlc2MpOwotCQkJCQkJb3V0cHV0cy5hZGQocHJvcCk7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlMYXVuY2hpbmdQbHVnaW4ubG9nKG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lELCAiT3V0cHV0IHByb3BlcnRpZXMgZmlsZSAiICsgb3V0cHV0UHJvcGVydGllc1VSTAotCQkJCQkJCQkrICIgbm90IGNvbmZpZ3VyZWQgcHJvcGVybHkgZm9yIGtleSAiICsga2V5KSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKQotCQl7Ci0JCQlMYXVuY2hpbmdQbHVnaW4ubG9nKGUpOwotCQl9Ci0JCWZpbmFsbHkKLQkJewotCQkJaWYgKGlzICE9IG51bGwpCi0JCQl7Ci0JCQkJdHJ5Ci0JCQkJewotCQkJCQlpcy5jbG9zZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkKLQkJCQl7Ci0JCQkJCUxhdW5jaGluZ1BsdWdpbi5sb2coZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiAoSU91dHB1dFByb3BlcnR5W10pIG91dHB1dHMudG9BcnJheShuZXcgSU91dHB1dFByb3BlcnR5WzBdKTsKLQl9Ci0KLQlwcml2YXRlIElGZWF0dXJlW10gbG9hZEZlYXR1cmVzKCkKLQl7Ci0JCUJ1ZmZlcmVkSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotCQlMaXN0PEZlYXR1cmU+IGZlYXR1cmVzTGlzdCA9IG5ldyBBcnJheUxpc3Q8RmVhdHVyZT4oKTsKLQkJdHJ5Ci0JCXsKLQkJCWlzID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oZmVhdHVyZVByb3BlcnRpZXNVUkwub3BlblN0cmVhbSgpKTsKLQkJCVByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotCQkJcHJvcHMubG9hZChpcyk7Ci0KLQkJCWZvciAoT2JqZWN0IGVsZW1lbnQgOiBwcm9wcy5rZXlTZXQoKSkKLQkJCXsKLQkJCQlTdHJpbmcga2V5ID0gKFN0cmluZykgZWxlbWVudDsKLQkJCQlpZiAoIWtleS5lbmRzV2l0aChERVNDX1NVRkZJWCkgJiYgIWtleS5lbmRzV2l0aChUWVBFX1NVRkZJWCkpCi0JCQkJewotCQkJCQlTdHJpbmcgdXJpID0gcHJvcHMuZ2V0UHJvcGVydHkoa2V5KTsKLQkJCQkJU3RyaW5nIHR5cGUgPSBwcm9wcy5nZXRQcm9wZXJ0eShrZXkgKyBUWVBFX1NVRkZJWCk7Ci0JCQkJCVN0cmluZyBkZXNjID0gcHJvcHMuZ2V0UHJvcGVydHkoa2V5ICsgREVTQ19TVUZGSVgpOwotCQkJCQlpZiAodXJpICE9IG51bGwgJiYgdHlwZSAhPSBudWxsICYmIGRlc2MgIT0gbnVsbCkKLQkJCQkJewotCQkJCQkJRmVhdHVyZSBmZWF0dXJlID0gbmV3IEZlYXR1cmUodXJpLnRyaW0oKSwgdHlwZS50cmltKCksIGRlc2MpOwotCQkJCQkJZmVhdHVyZXNMaXN0LmFkZChmZWF0dXJlKTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCUxhdW5jaGluZ1BsdWdpbi5sb2cobmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQsICJGZWF0dXJlIHByb3BlcnRpZXMgZmlsZSAiICsgZmVhdHVyZVByb3BlcnRpZXNVUkwKLQkJCQkJCQkJKyAiIG5vdCBjb25maWd1cmVkIHByb3Blcmx5IGZvciBrZXkgIiArIGtleSkpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKQotCQl7Ci0JCQlMYXVuY2hpbmdQbHVnaW4ubG9nKGUpOwotCQl9Ci0JCWZpbmFsbHkKLQkJewotCQkJaWYgKGlzICE9IG51bGwpCi0JCQl7Ci0JCQkJdHJ5Ci0JCQkJewotCQkJCQlpcy5jbG9zZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkKLQkJCQl7Ci0JCQkJCUxhdW5jaGluZ1BsdWdpbi5sb2coZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCUlGZWF0dXJlW10gZmVhdHVyZXMgPSAoSUZlYXR1cmVbXSkgZmVhdHVyZXNMaXN0LnRvQXJyYXkobmV3IElGZWF0dXJlWzBdKTsKLQkJQXJyYXlzLnNvcnQoZmVhdHVyZXMpOwotCQlyZXR1cm4gZmVhdHVyZXM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL1V0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9VdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWY4MTMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL1V0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotCi1wdWJsaWMgY2xhc3MgVXRpbHMKLXsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZpbGVMb2NhdGlvbihTdHJpbmcgYnVuZGxlSWQsIFN0cmluZyBwYXRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJU3RyaW5nIGxvY2F0aW9uID0gbnVsbDsKLQkJdHJ5Ci0JCXsKLQkJCVVSTCB1cmwgPSBGaWxlTG9jYXRvci5maW5kKFBsYXRmb3JtLmdldEJ1bmRsZShidW5kbGVJZCksIG5ldyBQYXRoKHBhdGgpLCBudWxsKTsKLQkJCWlmICh1cmwgIT0gbnVsbCkKLQkJCXsKLQkJCQlVUkwgZmlsZVVybCA9IEZpbGVMb2NhdG9yLnRvRmlsZVVSTCh1cmwpOwotCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGZpbGVVcmwuZ2V0RmlsZSgpKTsKLQkJCQlsb2NhdGlvbiA9IGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0JCXsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCwgSVN0YXR1cy5FUlJPUiwgIkVycm9yIGRldGVybWluaW5nIGphciBmaWxlIGxvY2F0aW9uOiAiICsgcGF0aCArICIgZnJvbSBidW5kbGU6ICIgKyBidW5kbGVJZCwgZSkpOwotCQl9IAotCQlyZXR1cm4gbG9jYXRpb247Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9YU0xQcm9wZXJ0eVRlc3Rlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvWFNMUHJvcGVydHlUZXN0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJkZDZiMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9YU0xQcm9wZXJ0eVRlc3Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLlByb3BlcnR5VGVzdGVyOwotCi1wdWJsaWMgY2xhc3MgWFNMUHJvcGVydHlUZXN0ZXIgZXh0ZW5kcyBQcm9wZXJ0eVRlc3RlcgotewotCXB1YmxpYyBib29sZWFuIHRlc3QoT2JqZWN0IGFyZzAsIFN0cmluZyBhcmcxLCBPYmplY3RbXSBhcmcyLCBPYmplY3QgYXJnMykKLQl7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL1hTTFRMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL1hTTFRMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUxMzUxMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9YU0xUTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmc7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0uRUZTOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5JRmlsZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUudmFyaWFibGVzLlZhcmlhYmxlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklCcmVha3BvaW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklEZWJ1Z0V2ZW50U2V0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSURlYnVnVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3RhY2tGcmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklWTVJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkphdmFMYXVuY2hEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuSURlYnVnZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLklQcm9jZXNzb3JJbnN0YWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLklQcm9jZXNzb3JJbnZva2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLklQcm9jZXNzb3JKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5YU0xUUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5jb25maWcuTGF1bmNoSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLm1vZGVsLklYU0xDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcubW9kZWwuWFNMRGVidWdUYXJnZXQ7Ci0KLXB1YmxpYyBjbGFzcyBYU0xUTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlIGV4dGVuZHMgSmF2YUxhdW5jaERlbGVnYXRlIGltcGxlbWVudHMgSURlYnVnRXZlbnRTZXRMaXN0ZW5lcgotewotCXByaXZhdGUgU3RyaW5nIG1vZGU7Ci0JcHJpdmF0ZSBMYXVuY2hIZWxwZXIgbGF1bmNoSGVscGVyOwotCQotCXByaXZhdGUgY2xhc3MgWFNMRGVidWdFdmVudFNldExpc3RlbmVyIGltcGxlbWVudHMgSURlYnVnRXZlbnRTZXRMaXN0ZW5lcgotCXsKLQkJcHJpdmF0ZSBJTGF1bmNoIGxhdW5jaDsKLQotCQlwdWJsaWMgWFNMRGVidWdFdmVudFNldExpc3RlbmVyKElMYXVuY2ggbGF1bmNoKQotCQl7Ci0JCQl0aGlzLmxhdW5jaCA9IGxhdW5jaDsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgaGFuZGxlRGVidWdFdmVudHMoRGVidWdFdmVudFtdIGV2ZW50cykKLQkJewotCQkJaWYgKGxhdW5jaC5nZXRQcm9jZXNzZXMoKS5sZW5ndGggPiAwKQotCQkJewotCQkJCWZvciAoRGVidWdFdmVudCBkZWJ1Z0V2ZW50IDogZXZlbnRzKQotCQkJCXsKLQkJCQkJaWYgKGRlYnVnRXZlbnQuZ2V0U291cmNlKCkgPT0gbGF1bmNoLmdldFByb2Nlc3NlcygpWzBdICYmIGRlYnVnRXZlbnQuZ2V0S2luZCgpID09IERlYnVnRXZlbnQuVEVSTUlOQVRFKQotCQkJCQl7Ci0JCQkJCQkvLyByZW1vdmUgc2VsZiBhcyBsaXN0ZW5lcgotCQkJCQkJRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLnJlbW92ZURlYnVnRXZlbnRMaXN0ZW5lcih0aGlzKTsKLQkJCQkJCUZpbGUgZmlsZSA9IGxhdW5jaEhlbHBlci5nZXRUYXJnZXQoKTsKLQkJCQkJCUlGaWxlIGlmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlRm9yTG9jYXRpb24obmV3IFBhdGgoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkpOwotCQkJCQkJaWYgKGlmaWxlICE9IG51bGwpCi0JCQkJCQl7Ly8gcmVmcmVzaCB0aGlzIHdvcmtzcGFjZSBmaWxlLi4KLQkJCQkJCQl0cnkKLQkJCQkJCQl7Ci0JCQkJCQkJCWlmaWxlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfWkVSTywgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKXsKLQkJCQkJCQkJCUBPdmVycmlkZQotCQkJCQkJCQkJcHVibGljIHZvaWQgZG9uZSgpCi0JCQkJCQkJCQl7Ci0JCQkJCQkJCQkJb3BlbkZpbGVJZlJlcXVpcmVkKCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCQkJCX0KLQkJCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotCQkJCQkJCXsKLQkJCQkJCQkJTGF1bmNoaW5nUGx1Z2luLmxvZyhlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQl7Ci0JCQkJCQkJb3BlbkZpbGVJZlJlcXVpcmVkKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgb3BlbkZpbGVJZlJlcXVpcmVkKCkKLQkJewotCQkJLy8gVE9ETyB0aGlzIGlzIGRpcnR5IC0gbmVlZCB0byBkZWNsYXJlIGV4dGVuc2lvbiBwb2ludCBhbmQgbW92ZSB0aGUgVUkgY29kZSBpbnRvIHRoZSBVSSBwbHVnaW4KLQkJCWlmIChsYXVuY2hIZWxwZXIuZ2V0T3BlbkZpbGVPbkNvbXBsZXRpb24oKSkKLQkJCXsKLQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkKLQkJCQl7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpCi0JCQkJCXsKLQkJCQkJCS8vIE9wZW4gZWRpdG9yIG9uIG5ldyBmaWxlLgotCQkJCQkJSVdvcmtiZW5jaFdpbmRvdyBkdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCQkJCQl0cnkKLQkJCQkJCXsKLQkJCQkJCQlGaWxlIGZpbGUgPSBsYXVuY2hIZWxwZXIuZ2V0VGFyZ2V0KCk7Ci0JCQkJCQkJUGF0aCBwYXRoID0gbmV3IFBhdGgoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJCQkJSUZpbGVTdG9yZSBmaWxlc3RvcmUgPSBFRlMuZ2V0TG9jYWxGaWxlU3lzdGVtKCkuZ2V0U3RvcmUocGF0aCk7Ci0JCQkJCQkJSURFLm9wZW5FZGl0b3JPbkZpbGVTdG9yZShkdy5nZXRBY3RpdmVQYWdlKCksIGZpbGVzdG9yZSk7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkKLQkJCQkJCXsKLQkJCQkJCQlMYXVuY2hpbmdQbHVnaW4ubG9nKGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgbGF1bmNoKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sIGZpbmFsIFN0cmluZyBtb2RlLCBmaW5hbCBJTGF1bmNoIGxhdW5jaCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJdGhpcy5tb2RlID0gbW9kZTsKLQkJbGF1bmNoSGVscGVyID0gbmV3IExhdW5jaEhlbHBlcihjb25maWd1cmF0aW9uKTsKLQkJbGF1bmNoSGVscGVyLnNhdmUoZ2V0TGF1bmNoQ29uZmlnRmlsZSgpKTsKLQkJRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmFkZERlYnVnRXZlbnRMaXN0ZW5lcihuZXcgWFNMRGVidWdFdmVudFNldExpc3RlbmVyKGxhdW5jaCkpOwotCi0JCS8vIHRoZSBzdXBlci5sYXVuY2ggd2lsbCBhZGQgYSBKYXZhIHNvdXJjZSBkaXJlY3RvciBpZiB3ZSBzZXQgaXQgdG8gbnVsbCBoZXJlCi0JCWZpbmFsIElTb3VyY2VMb2NhdG9yIGNvbmZpZ3VyZWRMb2NhdG9yID0gbGF1bmNoLmdldFNvdXJjZUxvY2F0b3IoKTsKLQkJbGF1bmNoLnNldFNvdXJjZUxvY2F0b3IobnVsbCk7Ci0KLQkJc3VwZXIubGF1bmNoKGNvbmZpZ3VyYXRpb24sIG1vZGUsIGxhdW5jaCwgbW9uaXRvcik7Ci0JCQotCQkvLyBub3cgZ2V0IHRoZSBqYXZhIHNvdXJjZSBsb2NhdG9yCi0JCWZpbmFsIElTb3VyY2VMb2NhdG9yIGphdmFTb3VyY2VMb29rdXBEaXJlY3RvciA9IChJU291cmNlTG9jYXRvcilsYXVuY2guZ2V0U291cmNlTG9jYXRvcigpOwotCQkvLyBub3cgYWRkIG91ciBvd24gcGFydGljaXBhbnQgdG8gdGhlIGphdmEgZGlyZWN0b3IKLQkJbGF1bmNoLnNldFNvdXJjZUxvY2F0b3IobmV3IElTb3VyY2VMb2NhdG9yKCl7Ci0KLQkJCXB1YmxpYyBPYmplY3QgZ2V0U291cmNlRWxlbWVudChJU3RhY2tGcmFtZSBzdGFja0ZyYW1lKSAKLQkJCXsKLQkJCQkvLyBzaW1wbHkgbG9vayBhdCBvbmUgYW5kIHRoZW4gdGhlIG90aGVyCi0JCQkJT2JqZWN0IHNvdXJjZUVsZW1lbnQgPSBqYXZhU291cmNlTG9va3VwRGlyZWN0b3IuZ2V0U291cmNlRWxlbWVudChzdGFja0ZyYW1lKTsKLQkJCQlpZiAoc291cmNlRWxlbWVudCA9PSBudWxsKQotCQkJCQlzb3VyY2VFbGVtZW50ID0gY29uZmlndXJlZExvY2F0b3IuZ2V0U291cmNlRWxlbWVudChzdGFja0ZyYW1lKTsKLQkJCQlyZXR1cm4gc291cmNlRWxlbWVudDsKLQkJCX19KTsKLQkJCi0vLwkJSUphdmFEZWJ1Z1RhcmdldCBqYXZhVGFyZ2V0ID0gKElKYXZhRGVidWdUYXJnZXQpbGF1bmNoLmdldERlYnVnVGFyZ2V0KCk7Ci0vLwkJbGF1bmNoLnJlbW92ZURlYnVnVGFyZ2V0KGphdmFUYXJnZXQpOwotCQlJRGVidWdUYXJnZXQgeHNsVGFyZ2V0ID0gbmV3IFhTTERlYnVnVGFyZ2V0KGxhdW5jaCwgbGF1bmNoLmdldFByb2Nlc3NlcygpWzBdLCBsYXVuY2hIZWxwZXIpOwotCQlsYXVuY2guYWRkRGVidWdUYXJnZXQoeHNsVGFyZ2V0KTsKLQkJCi0JLy8JbGF1bmNoLmFkZERlYnVnVGFyZ2V0KG5ldyBKYXZhWFNMRGVidWdUYXJnZXQobGF1bmNoLCBsYXVuY2guZ2V0UHJvY2Vzc2VzKClbMF0sIGxhdW5jaEhlbHBlciwgamF2YVRhcmdldCkpOwotCS8vCWxhdW5jaC5hZGREZWJ1Z1RhcmdldChuZXcgSmF2YVhTTERlYnVnVGFyZ2V0KGxhdW5jaCwgbGF1bmNoLmdldFByb2Nlc3NlcygpWzBdLCBsYXVuY2hIZWxwZXIsamF2YVRhcmdldCkpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgSmF2YSBicmVha3BvaW50IGFuZCB0aGUgWFNMIGJyZWFrcG9pbnRzCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElCcmVha3BvaW50W10gZ2V0QnJlYWtwb2ludHMoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikKLQl7Ci0JCUlCcmVha3BvaW50TWFuYWdlciBicmVha3BvaW50TWFuYWdlciA9IERlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCcmVha3BvaW50TWFuYWdlcigpOwotCQlpZiAoIWJyZWFrcG9pbnRNYW5hZ2VyLmlzRW5hYmxlZCgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlJQnJlYWtwb2ludFtdIGphdmFCcmVha3BvaW50cyA9IHN1cGVyLmdldEJyZWFrcG9pbnRzKGNvbmZpZ3VyYXRpb24pOwotCQlJQnJlYWtwb2ludFtdIHhzbEJyZWFrcG9pbnRzID0gYnJlYWtwb2ludE1hbmFnZXIuZ2V0QnJlYWtwb2ludHMoSVhTTENvbnN0YW50cy5JRF9YU0xfREVCVUdfTU9ERUwpOwotCQlJQnJlYWtwb2ludFtdIGJyZWFrcG9pbnRzID0gbmV3IElCcmVha3BvaW50W2phdmFCcmVha3BvaW50cy5sZW5ndGgreHNsQnJlYWtwb2ludHMubGVuZ3RoXTsKLQkJU3lzdGVtLmFycmF5Y29weShqYXZhQnJlYWtwb2ludHMsIDAsIGJyZWFrcG9pbnRzLCAwLCBqYXZhQnJlYWtwb2ludHMubGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weSh4c2xCcmVha3BvaW50cywgMCwgYnJlYWtwb2ludHMsIGphdmFCcmVha3BvaW50cy5sZW5ndGgsIHhzbEJyZWFrcG9pbnRzLmxlbmd0aCk7Ci0JCQotCQlyZXR1cm4gYnJlYWtwb2ludHM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcHJlTGF1bmNoQ2hlY2soSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgU3RyaW5nIG1vZGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCWlmIChtb2RlLmVxdWFscyhJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFKSkKLQkJewotCQkJZmluYWwgSVByb2Nlc3Nvckluc3RhbGwgaW5zdGFsbCA9IGdldFByb2Nlc3Nvckluc3RhbGwoY29uZmlndXJhdGlvbiwgSUxhdW5jaE1hbmFnZXIuUlVOX01PREUpOwotCQkJaWYgKGluc3RhbGwuZ2V0RGVidWdnZXIoKSA9PSBudWxsKQotCQkJewotCQkJCWZpbmFsIGJvb2xlYW5bXSByZXN1bHQgPSBuZXcgYm9vbGVhbltdCi0JCQkJeyBmYWxzZSB9OwotCQkJCS8vIG9wZW4gYSBkaWFsb2cgZm9yIGNob29zaW5nIGEgZGlmZmVyZW50IGluc3RhbGwgdGhhdCBkb2VzIGhhdmUKLQkJCQkvLyBhbiBhc3NvY2lhdGVkIGRlYnVnZ2VyCi0JCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkKLQkJCQl7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpCi0JCQkJCXsKLQkJCQkJCVN0cmluZyBkZWJ1Z2dpbmdJbnN0YWxsSWQgPSBMYXVuY2hpbmdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9ERUZBVUxUX0RFQlVHR0lOR19JTlNUQUxMX0lEKTsKLQkJCQkJCUlQcm9jZXNzb3JJbnN0YWxsIHByb2Nlc3NvciA9IFhTTFRSdW50aW1lLmdldFByb2Nlc3NvcihkZWJ1Z2dpbmdJbnN0YWxsSWQpOwotCi0JCQkJCQlJV29ya2JlbmNoV2luZG93IGR3ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJCQkJCXJlc3VsdFswXSA9IE1lc3NhZ2VEaWFsb2cub3BlblF1ZXN0aW9uKGR3LmdldFNoZWxsKCksICJYU0xUIFByb2Nlc3NvciBEZWJ1Z2dlciIsICJUaGUgIiArIGluc3RhbGwuZ2V0TmFtZSgpICsgIiBYU0xUIHByb2Nlc3NvciBkb2VzIG5vdCBzdXBwb3J0IGRlYnVnZ2luZy5cbiIKLQkJCQkJCQkJKyAiV291bGQgeW91IGxpa2UgdG8gZGVidWcgdXNpbmcgdGhlIGRlZmF1bHQgIiArIHByb2Nlc3Nvci5nZXROYW1lKCkgKyAiIHByb2Nlc3NvciBpbnN0ZWFkPyIpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJcmV0dXJuIHJlc3VsdFswXTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIucHJlTGF1bmNoQ2hlY2soY29uZmlndXJhdGlvbiwgbW9kZSwgbW9uaXRvcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIElWTVJ1bm5lciBnZXRWTVJ1bm5lcihJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBTdHJpbmcgbW9kZSkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCS8vIGNvbW1lbnQgdGhpcyBvdXQgaW4gb3JkZXIgdG8gZ2V0IGphdmEgZGVidWdnaW5nIGFzIHdlbGwgYXMgWFNMIGRlYnVnZ2luZwotLy8JCWlmIChJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFLmVxdWFscyhtb2RlKSkKLS8vCQkJcmV0dXJuIHN1cGVyLmdldFZNUnVubmVyKGNvbmZpZ3VyYXRpb24sIElMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFKTsKLQkJcmV0dXJuIHN1cGVyLmdldFZNUnVubmVyKGNvbmZpZ3VyYXRpb24sIG1vZGUpOwotCX0KLQotCXByaXZhdGUgRmlsZSBnZXRMYXVuY2hDb25maWdGaWxlKCkKLQl7Ci0JCUlQYXRoIGxhdW5jaFBhdGggPSBQbGF0Zm9ybS5nZXRTdGF0ZUxvY2F0aW9uKExhdW5jaGluZ1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkpLmFwcGVuZCgibGF1bmNoIik7Ci0JCUZpbGUgbGF1bmNoRGlyID0gbGF1bmNoUGF0aC50b0ZpbGUoKTsKLQkJaWYgKCFsYXVuY2hEaXIuZXhpc3RzKCkpCi0JCQlsYXVuY2hEaXIubWtkaXIoKTsKLQkJRmlsZSBmZWF0dXJlc0ZpbGUgPSBuZXcgRmlsZShsYXVuY2hEaXIsICJsYXVuY2gueG1sIik7Ci0JCXJldHVybiBmZWF0dXJlc0ZpbGU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIElQYXRoIGdldFdvcmtpbmdEaXJlY3RvcnlQYXRoKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlTdHJpbmcgcGF0aCA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QUk9DRVNTT1JfV09SS0lOR19ESVIsIChTdHJpbmcpIG51bGwpOwotCQlpZiAocGF0aCAhPSBudWxsKQotCQl7Ci0JCQlwYXRoID0gVmFyaWFibGVzUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTdHJpbmdWYXJpYWJsZU1hbmFnZXIoKS5wZXJmb3JtU3RyaW5nU3Vic3RpdHV0aW9uKHBhdGgpOwotCQkJcmV0dXJuIG5ldyBQYXRoKHBhdGgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgSVByb2Nlc3Nvckludm9rZXIgZ2V0UHJvY2Vzc29ySW52b2tlckRlc2NyaXB0b3IoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCVN0cmluZyBpbnZva2VySWQgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLklOVk9LRVJfREVTQ1JJUFRPUiwgKFN0cmluZykgbnVsbCk7Ci0JCWlmIChpbnZva2VySWQgPT0gbnVsbCkKLQkJCWludm9rZXJJZCA9ICJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5qYXhwLmludm9rZSI7Ci0JCXJldHVybiBYU0xUUnVudGltZS5nZXRQcm9jZXNzb3JJbnZva2VyKGludm9rZXJJZCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJUHJvY2Vzc29ySW5zdGFsbCBnZXRQcm9jZXNzb3JJbnN0YWxsKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sIFN0cmluZyBtb2RlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJSVByb2Nlc3Nvckluc3RhbGwgaW5zdGFsbDsKLQkJYm9vbGVhbiB1c2VEZWZhdWx0UHJvY2Vzc29yID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1VTRV9ERUZBVUxUX1BST0NFU1NPUiwgdHJ1ZSk7Ci0JCWlmICh1c2VEZWZhdWx0UHJvY2Vzc29yKQotCQl7Ci0JCQlpbnN0YWxsID0gWFNMVFJ1bnRpbWUuZ2V0RGVmYXVsdFByb2Nlc3NvcigpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJU3RyaW5nIHByb2Nlc3NvcklkID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BST0NFU1NPUiwgIiIpOwotCQkJaW5zdGFsbCA9IFhTTFRSdW50aW1lLmdldFByb2Nlc3Nvcihwcm9jZXNzb3JJZCk7Ci0JCX0KLQkJaWYgKG1vZGUuZXF1YWxzKElMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREUpICYmIGluc3RhbGwuZ2V0RGVidWdnZXIoKSA9PSBudWxsKQotCQl7Ci0JCQlTdHJpbmcgZGVidWdnaW5nSW5zdGFsbElkID0gTGF1bmNoaW5nUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldFN0cmluZyhYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfREVGQVVMVF9ERUJVR0dJTkdfSU5TVEFMTF9JRCk7Ci0JCQlpbnN0YWxsID0gWFNMVFJ1bnRpbWUuZ2V0UHJvY2Vzc29yKGRlYnVnZ2luZ0luc3RhbGxJZCk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRNYWluVHlwZU5hbWUoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCWlmIChJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFLmVxdWFscyhtb2RlKSkKLQkJCXJldHVybiAib3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Z2dlci5EZWJ1Z1J1bm5lciI7Ci0JCXJldHVybiAib3JnLmVjbGlwc2Uud3N0LnhzbC5pbnZva2VyLk1haW4iOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvZ3JhbUFyZ3VtZW50cyhJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJLy8gY2xhc3NuYW1lLCBzb3VyY2V1cmwsIG91dHB1dCBmaWxlCi0JCUlQcm9jZXNzb3JJbnZva2VyIGludm9rZXIgPSBnZXRQcm9jZXNzb3JJbnZva2VyRGVzY3JpcHRvcihjb25maWd1cmF0aW9uKTsKLQkJU3RyaW5nIGNsYXp6ID0gaW52b2tlci5nZXRJbnZva2VyQ2xhc3NOYW1lKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlzYi5hcHBlbmQoY2xhenopOwotCQlzYi5hcHBlbmQoIiAiKTsKLQkJc2IuYXBwZW5kKCJcIiIgKyBnZXRMYXVuY2hDb25maWdGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiXCIiKTsKLQkJc2IuYXBwZW5kKCIgIik7Ci0JCXNiLmFwcGVuZCgiXCIiICsgbGF1bmNoSGVscGVyLmdldFNvdXJjZSgpICsgIlwiIik7Ci0JCXNiLmFwcGVuZCgiICIpOwotCQlzYi5hcHBlbmQoIlwiIiArIGxhdW5jaEhlbHBlci5nZXRUYXJnZXQoKS5nZXRBYnNvbHV0ZVBhdGgoKSArICJcIiIpOwotCQlpZiAoSUxhdW5jaE1hbmFnZXIuREVCVUdfTU9ERS5lcXVhbHMobW9kZSkpCi0JCXsKLQkJCUlQcm9jZXNzb3JJbnN0YWxsIGluc3RhbGwgPSBnZXRQcm9jZXNzb3JJbnN0YWxsKGNvbmZpZ3VyYXRpb24sIG1vZGUpOwotCQkJaWYgKGluc3RhbGwuZ2V0RGVidWdnZXIoKSAhPSBudWxsKQotCQkJewotCQkJCUlEZWJ1Z2dlciBkZWJ1Z2dlciA9IGluc3RhbGwuZ2V0RGVidWdnZXIoKTsKLQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gZGVidWdnZXIuZ2V0Q2xhc3NOYW1lKCk7Ci0JCQkJc2IuYXBwZW5kKCIgLWRlYnVnICIpLmFwcGVuZChjbGFzc05hbWUpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZChsYXVuY2hIZWxwZXIuZ2V0UmVxdWVzdFBvcnQoKSkuYXBwZW5kKCIgIikuYXBwZW5kKGxhdW5jaEhlbHBlci5nZXRFdmVudFBvcnQoKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nW10gZ2V0Q2xhc3NwYXRoKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQkvLyBnZXQgdGhlIGNsYXNzcGF0aCBkZWZpbmVkIGJ5IHRoZSB1c2VyCi0JCVN0cmluZ1tdIHVzZXJDbGFzc3BhdGggPSBzdXBlci5nZXRDbGFzc3BhdGgoY29uZmlndXJhdGlvbik7Ci0KLQkJLy8gZ2V0IHRoZSBjbGFzc3BhdGggcmVxdWlyZWQgZm9yIHRoZSB0cmFuc2Zvcm1hdGlvbgotCQlJUHJvY2Vzc29ySW52b2tlciBpbnZva2VyID0gZ2V0UHJvY2Vzc29ySW52b2tlckRlc2NyaXB0b3IoY29uZmlndXJhdGlvbik7Ci0JCUxpc3Q8U3RyaW5nPiBpbnZva2VyQ1AgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJZm9yIChTdHJpbmcgZW50cnkgOiBpbnZva2VyLmdldENsYXNzcGF0aEVudHJpZXMoKSkKLQkJewotCQkJaW52b2tlckNQLmFkZChlbnRyeSk7Ci0JCX0KLQotCQkvLyBhZGQgdGhlIGRlYnVnZ2VyLi4uCi0JCUlQcm9jZXNzb3JJbnN0YWxsIGluc3RhbGwgPSBnZXRQcm9jZXNzb3JJbnN0YWxsKGNvbmZpZ3VyYXRpb24sIG1vZGUpOwotCQlpZiAoSUxhdW5jaE1hbmFnZXIuREVCVUdfTU9ERS5lcXVhbHMobW9kZSkgJiYgaW5zdGFsbC5nZXREZWJ1Z2dlcigpICE9IG51bGwpCi0JCXsKLQkJCVN0cmluZ1tdIGphcnMgPSBpbnN0YWxsLmdldERlYnVnZ2VyKCkuZ2V0Q2xhc3NQYXRoKCk7Ci0JCQlmb3IgKFN0cmluZyBqYXIgOiBqYXJzKQotCQkJewotCQkJCWludm9rZXJDUC5hZGQoamFyKTsKLQkJCX0KLQkJfQotCi0JCVN0cmluZ1tdIGludm9rZXJDbGFzc3BhdGggPSAoU3RyaW5nW10pIGludm9rZXJDUC50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotCi0JCS8vIGFkZCB0aGVtIHRvZ2V0aGVyCi0JCVN0cmluZ1tdIGNsYXNzcGF0aCA9IG5ldyBTdHJpbmdbdXNlckNsYXNzcGF0aC5sZW5ndGggKyBpbnZva2VyQ2xhc3NwYXRoLmxlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoaW52b2tlckNsYXNzcGF0aCwgMCwgY2xhc3NwYXRoLCAwLCBpbnZva2VyQ2xhc3NwYXRoLmxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkodXNlckNsYXNzcGF0aCwgMCwgY2xhc3NwYXRoLCBpbnZva2VyQ2xhc3NwYXRoLmxlbmd0aCwgdXNlckNsYXNzcGF0aC5sZW5ndGgpOwotCi0JCXJldHVybiBjbGFzc3BhdGg7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRWTUFyZ3VtZW50cyhJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJU3RyaW5nIHZtYXJncyA9IHN1cGVyLmdldFZNQXJndW1lbnRzKGNvbmZpZ3VyYXRpb24pOwotCi0JCUlQcm9jZXNzb3JJbnN0YWxsIGluc3RhbGwgPSBnZXRQcm9jZXNzb3JJbnN0YWxsKGNvbmZpZ3VyYXRpb24sIG1vZGUpOwotCQlpZiAoaW5zdGFsbCAhPSBudWxsICYmICFpbnN0YWxsLmdldFByb2Nlc3NvclR5cGUoKS5pc0pSRURlZmF1bHQoKSkKLQkJewotCQkJLy8gY2xlYXIgdGhlIGVuZG9yc2VkIGRpcgotCQkJRmlsZSB0ZW1wRGlyID0gZ2V0RW5kb3JzZWREaXIoKTsKLQkJCWlmICh0ZW1wRGlyLmV4aXN0cygpKQotCQkJewotCQkJCUZpbGVbXSBjaGlsZHJlbiA9IHRlbXBEaXIubGlzdEZpbGVzKCk7Ci0JCQkJZm9yIChGaWxlIGNoaWxkIDogY2hpbGRyZW4pCi0JCQkJewotCQkJCQljaGlsZC5kZWxldGUoKTsKLQkJCQl9Ci0JCQkJdGVtcERpci5kZWxldGUoKTsKLQkJCX0KLQkJCXRlbXBEaXIubWtkaXIoKTsKLQotCQkJLy8gbW92ZSB0aGUgcmVxdWlyZWQgamFycyB0byB0aGUgZW5kb3JzZWQgZGlyCi0JCQlJUHJvY2Vzc29ySmFyW10gamFycyA9IGluc3RhbGwuZ2V0UHJvY2Vzc29ySmFycygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqYXJzLmxlbmd0aDsgaSsrKQotCQkJewotCQkJCVVSTCBlbnRyeSA9IGphcnNbaV0uYXNVUkwoKTsKLQkJCQlpZiAoZW50cnkgPT0gbnVsbCkKLQkJCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lELCBJU3RhdHVzLkVSUk9SLCAiQ291bGQgbm90IGxvY2F0ZSBqYXIgZmlsZSAiICsgamFyc1tpXSwgbnVsbCkpOwotCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHRlbXBEaXIsICJFTkRfIiArIGkgKyAiLmphciIpOwotCQkJCW1vdmVGaWxlKGVudHJ5LCBmaWxlKTsKLQkJCX0KLQkJCS8vIGFkZCB0aGUgZW5kb3JzZWQgZGlyCi0JCQl2bWFyZ3MgKz0gIiAtRGphdmEuZW5kb3JzZWQuZGlycz1cIiIgKyB0ZW1wRGlyLmdldEFic29sdXRlUGF0aCgpICsgIlwiIjsKLQkJCVN0cmluZyB0ZmFjdG9yeSA9IGluc3RhbGwuZ2V0UHJvY2Vzc29yVHlwZSgpLmdldFRyYW5zZm9ybWVyRmFjdG9yeU5hbWUoKTsKLQkJCWlmICh0ZmFjdG9yeSAhPSBudWxsKQotCQkJCXZtYXJncyArPSAiIC1EamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk9IiArIGluc3RhbGwuZ2V0UHJvY2Vzc29yVHlwZSgpLmdldFRyYW5zZm9ybWVyRmFjdG9yeU5hbWUoKTsKLQkJfQotCQlyZXR1cm4gdm1hcmdzOwotCX0KLQotCXByaXZhdGUgRmlsZSBnZXRFbmRvcnNlZERpcigpCi0JewotCQlJUGF0aCB0ZW1wTG9jYXRpb24gPSBQbGF0Zm9ybS5nZXRTdGF0ZUxvY2F0aW9uKExhdW5jaGluZ1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkpLmFwcGVuZCgiZW5kb3JzZWQiKTsKLQkJcmV0dXJuIHRlbXBMb2NhdGlvbi50b0ZpbGUoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIG1vdmVGaWxlKFVSTCBzcmMsIEZpbGUgdGFyZ2V0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJQnVmZmVyZWRPdXRwdXRTdHJlYW0gYm9zID0gbnVsbDsKLQkJQnVmZmVyZWRJbnB1dFN0cmVhbSBiaXMgPSBudWxsOwotCQl0cnkKLQkJewotCQkJYm9zID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRhcmdldCkpOwotCQkJYmlzID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oc3JjLm9wZW5TdHJlYW0oKSk7Ci0JCQl3aGlsZSAoYmlzLmF2YWlsYWJsZSgpID4gMCkKLQkJCXsKLQkJCQlpbnQgc2l6ZSA9IGJpcy5hdmFpbGFibGUoKTsKLQkJCQlpZiAoc2l6ZSA+IDEwMjQpCi0JCQkJCXNpemUgPSAxMDI0OwotCQkJCWJ5dGVbXSBiID0gbmV3IGJ5dGVbc2l6ZV07Ci0JCQkJYmlzLnJlYWQoYiwgMCwgYi5sZW5ndGgpOwotCQkJCWJvcy53cml0ZShiKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkKLQkJewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lELCBJU3RhdHVzLkVSUk9SLCAiRXJyb3IgY29weWluZyB1cmwgIiArIHNyYyArICIgdG8gIiArIHRhcmdldCwgZSkpOwotCQl9Ci0JCWZpbmFsbHkKLQkJewotCQkJaWYgKGJpcyAhPSBudWxsKQotCQkJewotCQkJCXRyeQotCQkJCXsKLQkJCQkJYmlzLmNsb3NlKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKQotCQkJCXsKLQkJCQkJTGF1bmNoaW5nUGx1Z2luLmxvZyhlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoYm9zICE9IG51bGwpCi0JCQl7Ci0JCQkJdHJ5Ci0JCQkJewotCQkJCQlib3MuY2xvc2UoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0JCQkJewotCQkJCQlMYXVuY2hpbmdQbHVnaW4ubG9nKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL1hTTFRTb3VyY2VMb29rdXBEaXJlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvWFNMVFNvdXJjZUxvb2t1cERpcmVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhM2U3M2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvWFNMVFNvdXJjZUxvb2t1cERpcmVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLkFic3RyYWN0U291cmNlTG9va3VwRGlyZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5zb3VyY2Vsb29rdXAuSVNvdXJjZUxvb2t1cFBhcnRpY2lwYW50OwotCi1wdWJsaWMgY2xhc3MgWFNMVFNvdXJjZUxvb2t1cERpcmVjdG9yIGV4dGVuZHMgQWJzdHJhY3RTb3VyY2VMb29rdXBEaXJlY3RvcgotewotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYXJ0aWNpcGFudHMoKQotCXsKLQkJYWRkUGFydGljaXBhbnRzKG5ldyBJU291cmNlTG9va3VwUGFydGljaXBhbnRbXXsgbmV3IFhTTFRTb3VyY2VMb29rdXBQYXJ0aWNpcGFudCgpIH0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL1hTTFRTb3VyY2VMb29rdXBQYXJ0aWNpcGFudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvWFNMVFNvdXJjZUxvb2t1cFBhcnRpY2lwYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlMjMyODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvWFNMVFNvdXJjZUxvb2t1cFBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLkFic3RyYWN0U291cmNlTG9va3VwUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcubW9kZWwuWFNMU3RhY2tGcmFtZTsKLQotLyoqCi0gKiBUcmFuc2xhdGUgYSBzdGFjayBmcmFtZSBpbnRvIGEgc291cmNlIGZpbGUgbmFtZQotICovCi1wdWJsaWMgY2xhc3MgWFNMVFNvdXJjZUxvb2t1cFBhcnRpY2lwYW50IGV4dGVuZHMgQWJzdHJhY3RTb3VyY2VMb29rdXBQYXJ0aWNpcGFudAotewotCXB1YmxpYyBTdHJpbmcgZ2V0U291cmNlTmFtZShPYmplY3Qgb2JqZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTTFN0YWNrRnJhbWUpCi0JCXsKLQkJCXJldHVybiAoKFhTTFN0YWNrRnJhbWUpIG9iamVjdCkuZ2V0U291cmNlTmFtZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL1hTTFRTb3VyY2VQYXRoQ29tcHV0ZXJEZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvWFNMVFNvdXJjZVBhdGhDb21wdXRlckRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmZWI2OTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvWFNMVFNvdXJjZVBhdGhDb21wdXRlckRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmc7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnZhcmlhYmxlcy5WYXJpYWJsZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5JU291cmNlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLklTb3VyY2VQYXRoQ29tcHV0ZXJEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5jb250YWluZXJzLkRpcmVjdG9yeVNvdXJjZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5jb250YWluZXJzLkZvbGRlclNvdXJjZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5jb250YWluZXJzLlByb2plY3RTb3VyY2VDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5jb25maWcuTGF1bmNoUGlwZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuY29uZmlnLkxhdW5jaFRyYW5zZm9ybTsKLQotcHVibGljIGNsYXNzIFhTTFRTb3VyY2VQYXRoQ29tcHV0ZXJEZWxlZ2F0ZSBpbXBsZW1lbnRzIElTb3VyY2VQYXRoQ29tcHV0ZXJEZWxlZ2F0ZQotewotCXB1YmxpYyBJU291cmNlQ29udGFpbmVyW10gY29tcHV0ZVNvdXJjZUNvbnRhaW5lcnMoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJTGlzdDxJU291cmNlQ29udGFpbmVyPiBjb250YWluZXJzID0gbmV3IEFycmF5TGlzdDxJU291cmNlQ29udGFpbmVyPigpOwotCi0JCVN0cmluZyBzb3VyY2VGaWxlRXhwciA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9JTlBVVF9GSUxFLCAoU3RyaW5nKSBudWxsKTsKLQkJSVBhdGggc291cmNlRmlsZSA9IGdldFN1YnN0aXR1dGVkUGF0aChzb3VyY2VGaWxlRXhwcik7Ci0JCUxhdW5jaFBpcGVsaW5lIHBpcGVsaW5lID0gaHlkcmF0ZVBpcGVsaW5lKGNvbmZpZ3VyYXRpb24pOwotCi0JCS8vIFRPRE8gaGF2ZSBzb21lIHdheSBvZiBrbm93aW5nIHdoZXRoZXIgaXQgaXMgYW4gSVJlc291cmNlIG9yIG5vdAotCQljb250YWluZXJzLmFkZChuZXcgRGlyZWN0b3J5U291cmNlQ29udGFpbmVyKHNvdXJjZUZpbGUsIGZhbHNlKSk7Ci0KLQkJZm9yIChJdGVyYXRvcjw/PiBpdGVyID0gcGlwZWxpbmUuZ2V0VHJhbnNmb3JtRGVmcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLQkJewotCQkJTGF1bmNoVHJhbnNmb3JtIHRyYW5zZm9ybSA9IChMYXVuY2hUcmFuc2Zvcm0pIGl0ZXIubmV4dCgpOwotCQkJSVBhdGggcGF0aCA9IHRyYW5zZm9ybS5nZXRQYXRoKCk7Ci0JCQlJU291cmNlQ29udGFpbmVyIHNvdXJjZUNvbnRhaW5lciA9IG51bGw7Ci0JCQlpZiAodHJhbnNmb3JtLmdldFBhdGhUeXBlKCkuZXF1YWxzKExhdW5jaFRyYW5zZm9ybS5SRVNPVVJDRV9UWVBFKSkKLQkJCXsKLQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIocGF0aCk7Ci0JCQkJSUNvbnRhaW5lciBjb250YWluZXIgPSByZXNvdXJjZS5nZXRQYXJlbnQoKTsKLQkJCQlpZiAoY29udGFpbmVyLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCkKLQkJCQl7Ci0JCQkJCXNvdXJjZUNvbnRhaW5lciA9IG5ldyBQcm9qZWN0U291cmNlQ29udGFpbmVyKChJUHJvamVjdCkgY29udGFpbmVyLCBmYWxzZSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGNvbnRhaW5lci5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZPTERFUikKLQkJCQl7Ci0JCQkJCXNvdXJjZUNvbnRhaW5lciA9IG5ldyBGb2xkZXJTb3VyY2VDb250YWluZXIoY29udGFpbmVyLCBmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXNvdXJjZUNvbnRhaW5lciA9IG5ldyBEaXJlY3RvcnlTb3VyY2VDb250YWluZXIocGF0aCwgZmFsc2UpOwotCQkJfQotCQkJY29udGFpbmVycy5hZGQoc291cmNlQ29udGFpbmVyKTsKLQkJfQotCi0JCS8vIGlmIChzb3VyY2VDb250YWluZXIgPT0gbnVsbCkKLQkJLy8gewotCQkvLyBzb3VyY2VDb250YWluZXIgPSBuZXcgV29ya3NwYWNlU291cmNlQ29udGFpbmVyKCk7Ci0JCS8vIH0KLQotCQlyZXR1cm4gKElTb3VyY2VDb250YWluZXJbXSkgY29udGFpbmVycy50b0FycmF5KG5ldyBJU291cmNlQ29udGFpbmVyWzBdKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBMYXVuY2hQaXBlbGluZSBoeWRyYXRlUGlwZWxpbmUoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCUxhdW5jaFBpcGVsaW5lIHBpcGVsaW5lID0gbnVsbDsKLQkJU3RyaW5nIHMgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfUElQRUxJTkUsIChTdHJpbmcpIG51bGwpOwotCQlpZiAocyAhPSBudWxsICYmIHMubGVuZ3RoKCkgPiAwKQotCQl7Ci0JCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzLmdldEJ5dGVzKCkpOwotCQkJcGlwZWxpbmUgPSBMYXVuY2hQaXBlbGluZS5mcm9tWE1MKGlucHV0U3RyZWFtKTsKLQkJfQotCQlyZXR1cm4gcGlwZWxpbmU7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSVBhdGggZ2V0U3Vic3RpdHV0ZWRQYXRoKFN0cmluZyBwYXRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJaWYgKHBhdGggIT0gbnVsbCkKLQkJewotCQkJcGF0aCA9IFZhcmlhYmxlc1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RyaW5nVmFyaWFibGVNYW5hZ2VyKCkucGVyZm9ybVN0cmluZ1N1YnN0aXR1dGlvbihwYXRoKTsKLQkJCXJldHVybiBuZXcgUGF0aChwYXRoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL3JlZ2lzdHJ5L0Fic3RyYWN0UmVnaXN0cnlSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL3JlZ2lzdHJ5L0Fic3RyYWN0UmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkwNzZjMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9yZWdpc3RyeS9BYnN0cmFjdFJlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmcucmVnaXN0cnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmcuTGF1bmNoaW5nUGx1Z2luOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZWdpc3RyeVJlYWRlcgotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0RFU0NSSVBUSU9OID0gImRlc2NyaXB0aW9uIjsKLQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBsb2dFcnJvcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHRleHQpCi0JewotCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCk7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1Zi5hcHBlbmQoIlBsdWdpbiAiICsgZXh0ZW5zaW9uLmdldE5hbWVzcGFjZUlkZW50aWZpZXIoKSArICIsIGV4dGVuc2lvbiAiICsgZXh0ZW5zaW9uLmdldEV4dGVuc2lvblBvaW50VW5pcXVlSWRlbnRpZmllcigpKTsKLQkJYnVmLmFwcGVuZCgiXG4iICsgdGV4dCk7Ci0JCUxhdW5jaGluZ1BsdWdpbi5sb2cobmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lELCBJU3RhdHVzLk9LLCBidWYudG9TdHJpbmcoKSwgbnVsbCkpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgbG9nTWlzc2luZ0F0dHJpYnV0ZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpCi0JewotCQlsb2dFcnJvcihlbGVtZW50LCAiUmVxdWlyZWQgYXR0cmlidXRlICciICsgYXR0cmlidXRlTmFtZSArICInIG5vdCBkZWZpbmVkIik7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGxvZ01pc3NpbmdFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgZWxlbWVudE5hbWUpCi0JewotCQlsb2dFcnJvcihlbGVtZW50LCAiUmVxdWlyZWQgc3ViIGVsZW1lbnQgJyIgKyBlbGVtZW50TmFtZSArICInIG5vdCBkZWZpbmVkIik7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGxvZ1Vua25vd25FbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KQotCXsKLQkJbG9nRXJyb3IoZWxlbWVudCwgIlVua25vd24gZXh0ZW5zaW9uIHRhZyBmb3VuZDogIiArIGVsZW1lbnQuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElFeHRlbnNpb25bXSBvcmRlckV4dGVuc2lvbnMoSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMpCi0JewotCQlJRXh0ZW5zaW9uW10gc29ydGVkRXh0ZW5zaW9uID0gbmV3IElFeHRlbnNpb25bZXh0ZW5zaW9ucy5sZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGV4dGVuc2lvbnMsIDAsIHNvcnRlZEV4dGVuc2lvbiwgMCwgZXh0ZW5zaW9ucy5sZW5ndGgpOwotCQlDb21wYXJhdG9yPElFeHRlbnNpb24+IGNvbXBhcmVyID0gbmV3IENvbXBhcmF0b3I8SUV4dGVuc2lvbj4oKQotCQl7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoSUV4dGVuc2lvbiBhcmcwLCBJRXh0ZW5zaW9uIGFyZzEpCi0JCQl7Ci0JCQkJU3RyaW5nIHMxID0gYXJnMC5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCk7Ci0JCQkJU3RyaW5nIHMyID0gYXJnMS5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCk7Ci0JCQkJcmV0dXJuIHMxLmNvbXBhcmVUb0lnbm9yZUNhc2UoczIpOwotCQkJfQotCQl9OwotCQlDb2xsZWN0aW9ucy5zb3J0KEFycmF5cy5hc0xpc3Qoc29ydGVkRXh0ZW5zaW9uKSwgY29tcGFyZXIpOwotCQlyZXR1cm4gc29ydGVkRXh0ZW5zaW9uOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KTsKLQotCXByb3RlY3RlZCB2b2lkIHJlYWRFbGVtZW50Q2hpbGRyZW4oSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpCi0JewotCQlyZWFkRWxlbWVudHMoZWxlbWVudC5nZXRDaGlsZHJlbigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWFkRWxlbWVudHMoSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMpCi0JewotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotCQl7Ci0JCQlpZiAoIXJlYWRFbGVtZW50KGVsZW1lbnRzW2ldKSkKLQkJCQlsb2dVbmtub3duRWxlbWVudChlbGVtZW50c1tpXSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWFkRXh0ZW5zaW9uKElFeHRlbnNpb24gZXh0ZW5zaW9uKQotCXsKLQkJcmVhZEVsZW1lbnRzKGV4dGVuc2lvbi5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVhZFJlZ2lzdHJ5KElFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSwgU3RyaW5nIHBsdWdpbklkLCBTdHJpbmcgZXh0ZW5zaW9uUG9pbnQpCi0JewotCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChwbHVnaW5JZCwgZXh0ZW5zaW9uUG9pbnQpOwotCQlpZiAocG9pbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBwb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCWV4dGVuc2lvbnMgPSBvcmRlckV4dGVuc2lvbnMoZXh0ZW5zaW9ucyk7Ci0JCWZvciAoSUV4dGVuc2lvbiBlbGVtZW50IDogZXh0ZW5zaW9ucykKLQkJCXJlYWRFeHRlbnNpb24oZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQpCi0JewotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjaGlsZHJlbiA9IGNvbmZpZ0VsZW1lbnQuZ2V0Q2hpbGRyZW4oVEFHX0RFU0NSSVBUSU9OKTsKLQkJaWYgKGNoaWxkcmVuLmxlbmd0aCA+PSAxKQotCQl7Ci0JCQlyZXR1cm4gY2hpbGRyZW5bMF0uZ2V0VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gIiI7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q2xhc3NWYWx1ZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCwgU3RyaW5nIGNsYXNzQXR0cmlidXRlTmFtZSkKLQl7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZShjbGFzc0F0dHJpYnV0ZU5hbWUpOwotCQlpZiAoY2xhc3NOYW1lICE9IG51bGwpCi0JCQlyZXR1cm4gY2xhc3NOYW1lOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjYW5kaWRhdGVDaGlsZHJlbiA9IGNvbmZpZ0VsZW1lbnQuZ2V0Q2hpbGRyZW4oY2xhc3NBdHRyaWJ1dGVOYW1lKTsKLQkJaWYgKGNhbmRpZGF0ZUNoaWxkcmVuLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJcmV0dXJuIGNhbmRpZGF0ZUNoaWxkcmVuWzBdLmdldEF0dHJpYnV0ZShBVFRfQ0xBU1MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9yZWdpc3RyeS9EZWJ1Z2dlclJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9yZWdpc3RyeS9EZWJ1Z2dlclJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YWFlZGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvcmVnaXN0cnkvRGVidWdnZXJSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmcucmVnaXN0cnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmcuRGVidWdnZXJEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLklEZWJ1Z2dlcjsKLQotcHVibGljIGNsYXNzIERlYnVnZ2VyUmVnaXN0cnkKLXsKLQlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIERlYnVnZ2VyRGVzY3JpcHRvcj4gZGVidWdnZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBEZWJ1Z2dlckRlc2NyaXB0b3I+KCk7Ci0KLQlwdWJsaWMgRGVidWdnZXJSZWdpc3RyeSgpCi0JewotCQlEZWJ1Z2dlclJlZ2lzdHJ5UmVhZGVyIHJlZ2lzdHJ5UmVhZGVyID0gbmV3IERlYnVnZ2VyUmVnaXN0cnlSZWFkZXIoKTsKLQkJcmVnaXN0cnlSZWFkZXIuYWRkQ29uZmlncyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgSURlYnVnZ2VyIGdldERlYnVnZ2VyKFN0cmluZyBpZCkKLQl7Ci0JCXJldHVybiAoSURlYnVnZ2VyKSBkZWJ1Z2dlcnMuZ2V0KGlkKTsKLQl9Ci0KLQlwdWJsaWMgSURlYnVnZ2VyW10gZ2V0RGVidWdnZXJzKCkKLQl7Ci0JCXJldHVybiAoSURlYnVnZ2VyW10pIGRlYnVnZ2Vycy52YWx1ZXMoKS50b0FycmF5KG5ldyBJRGVidWdnZXJbMF0pOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZERlYnVnZ2VyKERlYnVnZ2VyRGVzY3JpcHRvciBkZXNjKQotCXsKLQkJZGVidWdnZXJzLnB1dChkZXNjLmdldElkKCksIGRlc2MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL3JlZ2lzdHJ5L0RlYnVnZ2VyUmVnaXN0cnlSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL3JlZ2lzdHJ5L0RlYnVnZ2VyUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJkMGNjMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9yZWdpc3RyeS9EZWJ1Z2dlclJlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZy5yZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmcuRGVidWdnZXJEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nLkxhdW5jaGluZ1BsdWdpbjsKLQotcHVibGljIGNsYXNzIERlYnVnZ2VyUmVnaXN0cnlSZWFkZXIgZXh0ZW5kcyBBYnN0cmFjdFJlZ2lzdHJ5UmVhZGVyCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0RFQlVHR0VSID0gImRlYnVnZ2VyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfSUQgPSAiaWQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DTEFTU05BTUUgPSAiY2xhc3NOYW1lIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfQ0xBU1NQQVRIID0gImNsYXNzcGF0aCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX05BTUUgPSAibmFtZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1BST0NFU1NPUl9UWVBFX0lEID0gInByb2Nlc3NvclR5cGVJZCI7Ci0KLQlwcml2YXRlIERlYnVnZ2VyUmVnaXN0cnkgcmVnaXN0cnk7Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkKLQl7Ci0JCWlmICghZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKFRBR19ERUJVR0dFUikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJU3RyaW5nIGlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0lEKTsKLQkJaWYgKGlkID09IG51bGwpCi0JCXsKLQkJCWxvZ01pc3NpbmdBdHRyaWJ1dGUoZWxlbWVudCwgQVRUX0lEKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9DTEFTU05BTUUpOwotCQlpZiAoY2xhc3NOYW1lID09IG51bGwpCi0JCXsKLQkJCWxvZ01pc3NpbmdBdHRyaWJ1dGUoZWxlbWVudCwgQVRUX0NMQVNTTkFNRSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCVN0cmluZyBjbGFzc3BhdGggPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfQ0xBU1NQQVRIKTsKLQkJaWYgKGNsYXNzcGF0aCA9PSBudWxsKQotCQl7Ci0JCQlsb2dNaXNzaW5nQXR0cmlidXRlKGVsZW1lbnQsIEFUVF9DTEFTU1BBVEgpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlTdHJpbmdbXSBlbnRyaWVzID0gY2xhc3NwYXRoLnNwbGl0KCI7Iik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykKLQkJewotCQkJU3RyaW5nIHN0cmluZyA9IGVudHJpZXNbaV07Ci0JCQllbnRyaWVzW2ldID0gc3RyaW5nLnRyaW0oKTsKLQkJfQotCi0JCVN0cmluZyBuYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX05BTUUpOwotCQlpZiAobmFtZSA9PSBudWxsKQotCQl7Ci0JCQlsb2dNaXNzaW5nQXR0cmlidXRlKGVsZW1lbnQsIEFUVF9OQU1FKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJU3RyaW5nIHByb2Nlc3NvclR5cGVJZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9QUk9DRVNTT1JfVFlQRV9JRCk7Ci0JCWlmIChwcm9jZXNzb3JUeXBlSWQgPT0gbnVsbCkKLQkJewotCQkJbG9nTWlzc2luZ0F0dHJpYnV0ZShlbGVtZW50LCBBVFRfUFJPQ0VTU09SX1RZUEVfSUQpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlyZWdpc3RyeS5hZGREZWJ1Z2dlcihuZXcgRGVidWdnZXJEZXNjcmlwdG9yKGlkLCBlbGVtZW50LmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpLCBjbGFzc05hbWUsIGVudHJpZXMsIG5hbWUsIHByb2Nlc3NvclR5cGVJZCkpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlYWRFbGVtZW50KERlYnVnZ2VyUmVnaXN0cnkgcmVnaXN0cnksIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KQotCXsKLQkJdGhpcy5yZWdpc3RyeSA9IHJlZ2lzdHJ5OwotCQlyZWFkRWxlbWVudChlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRDb25maWdzKERlYnVnZ2VyUmVnaXN0cnkgcmVnaXN0cnkpCi0JewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQl0aGlzLnJlZ2lzdHJ5ID0gcmVnaXN0cnk7Ci0JCXJlYWRSZWdpc3RyeShleHRlbnNpb25SZWdpc3RyeSwgTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCwgImRlYnVnZ2VyIik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvcmVnaXN0cnkvSW52b2tlclJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9yZWdpc3RyeS9JbnZva2VyUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODViZDdlYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9yZWdpc3RyeS9JbnZva2VyUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nLnJlZ2lzdHJ5OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLklQcm9jZXNzb3JJbnZva2VyOwotCi1wdWJsaWMgY2xhc3MgSW52b2tlclJlZ2lzdHJ5Ci17Ci0JcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBJUHJvY2Vzc29ySW52b2tlcj4gaW52b2tlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIElQcm9jZXNzb3JJbnZva2VyPigpOwotCi0JcHVibGljIEludm9rZXJSZWdpc3RyeSgpCi0JewotCQlJbnZva2VyUmVnaXN0cnlSZWFkZXIgcmVnaXN0cnlSZWFkZXIgPSBuZXcgSW52b2tlclJlZ2lzdHJ5UmVhZGVyKCk7Ci0JCXJlZ2lzdHJ5UmVhZGVyLmFkZENvbmZpZ3ModGhpcyk7Ci0JfQotCi0JcHVibGljIElQcm9jZXNzb3JJbnZva2VyIGdldFByb2Nlc3Nvckludm9rZXIoU3RyaW5nIGlkKQotCXsKLQkJcmV0dXJuIChJUHJvY2Vzc29ySW52b2tlcikgaW52b2tlcnMuZ2V0KGlkKTsKLQl9Ci0KLQlwdWJsaWMgSVByb2Nlc3Nvckludm9rZXJbXSBnZXRQcm9jZXNzb3JJbnZva2VycygpCi0JewotCQlyZXR1cm4gKElQcm9jZXNzb3JJbnZva2VyW10pIGludm9rZXJzLnZhbHVlcygpLnRvQXJyYXkobmV3IElQcm9jZXNzb3JJbnZva2VyWzBdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRJbnZva2VyRGVzY3JpcHRvcihJUHJvY2Vzc29ySW52b2tlciBkZXNjKQotCXsKLQkJaW52b2tlcnMucHV0KGRlc2MuZ2V0SWQoKSwgZGVzYyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvcmVnaXN0cnkvSW52b2tlclJlZ2lzdHJ5UmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9yZWdpc3RyeS9JbnZva2VyUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE0ODFiMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9yZWdpc3RyeS9JbnZva2VyUmVnaXN0cnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nLnJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZy5MYXVuY2hpbmdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmcuUHJvY2Vzc29ySW52b2tlckRlc2NyaXB0b3I7Ci0KLXB1YmxpYyBjbGFzcyBJbnZva2VyUmVnaXN0cnlSZWFkZXIgZXh0ZW5kcyBBYnN0cmFjdFJlZ2lzdHJ5UmVhZGVyCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0lOVk9LRSA9ICJpbnZva2VyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfSUQgPSAiaWQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NMQVNTUEFUSCA9ICJjbGFzc3BhdGgiOwotCi0JcHJpdmF0ZSBJbnZva2VyUmVnaXN0cnkgcmVnaXN0cnk7Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkKLQl7Ci0JCWlmICghZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKFRBR19JTlZPS0UpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCVN0cmluZyBpZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9JRCk7Ci0JCWlmIChpZCA9PSBudWxsKQotCQl7Ci0JCQlsb2dNaXNzaW5nQXR0cmlidXRlKGVsZW1lbnQsIEFUVF9JRCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCVN0cmluZyBjbGFzc25hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfQ0xBU1MpOwotCQlpZiAoY2xhc3NuYW1lID09IG51bGwpCi0JCXsKLQkJCWxvZ01pc3NpbmdBdHRyaWJ1dGUoZWxlbWVudCwgQVRUX0NMQVNTKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJU3RyaW5nIGNsYXNzcGF0aCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9DTEFTU1BBVEgpOwotCQlpZiAoY2xhc3NwYXRoID09IG51bGwpCi0JCXsKLQkJCWxvZ01pc3NpbmdBdHRyaWJ1dGUoZWxlbWVudCwgQVRUX0NMQVNTUEFUSCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCVN0cmluZ1tdIGVudHJpZXMgPSBjbGFzc3BhdGguc3BsaXQoIjsiKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKQotCQl7Ci0JCQlTdHJpbmcgc3RyaW5nID0gZW50cmllc1tpXTsKLQkJCWVudHJpZXNbaV0gPSBzdHJpbmcudHJpbSgpOwotCQl9Ci0KLQkJcmVnaXN0cnkuYWRkSW52b2tlckRlc2NyaXB0b3IobmV3IFByb2Nlc3Nvckludm9rZXJEZXNjcmlwdG9yKGlkLCBlbGVtZW50LmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpLCBjbGFzc25hbWUsIGVudHJpZXMpKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWFkRWxlbWVudChJbnZva2VyUmVnaXN0cnkgcmVnaXN0cnksIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KQotCXsKLQkJdGhpcy5yZWdpc3RyeSA9IHJlZ2lzdHJ5OwotCQlyZWFkRWxlbWVudChlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRDb25maWdzKEludm9rZXJSZWdpc3RyeSByZWdpc3RyeSkKLQl7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCXRoaXMucmVnaXN0cnkgPSByZWdpc3RyeTsKLQkJcmVhZFJlZ2lzdHJ5KGV4dGVuc2lvblJlZ2lzdHJ5LCBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lELCAiaW52b2tlIik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvcmVnaXN0cnkvUHJvY2Vzc29yUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL3JlZ2lzdHJ5L1Byb2Nlc3NvclJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YTcyYTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvcmVnaXN0cnkvUHJvY2Vzc29yUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZy5yZWdpc3RyeTsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZy5MYXVuY2hpbmdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmcuUHJvY2Vzc29yUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuSVByb2Nlc3Nvckluc3RhbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuSVByb2Nlc3NvckphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5Qcm9jZXNzb3JJbnN0YWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLlhTTFRSdW50aW1lOwotCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc29yUmVnaXN0cnkKLXsKLQlwcml2YXRlIGZpbmFsIExpc3Q8UHJvY2Vzc29ySW5zdGFsbD4gY29udHJpYnV0ZWRJbnN0YWxscyA9IG5ldyBBcnJheUxpc3Q8UHJvY2Vzc29ySW5zdGFsbD4oKTsKLQlwcml2YXRlIExpc3Q8SVByb2Nlc3Nvckluc3RhbGw+IHVzZXJJbnN0YWxscyA9IG5ldyBBcnJheUxpc3Q8SVByb2Nlc3Nvckluc3RhbGw+KCk7Ci0JcHJpdmF0ZSBJUHJvY2Vzc29ySW5zdGFsbCBkZWZhdWx0UHJvY2Vzc29yOwotCXByaXZhdGUgSVByb2Nlc3Nvckluc3RhbGwganJlRGVmYXVsdFByb2Nlc3NvcjsKLQlwcml2YXRlIElQcm9jZXNzb3JJbnN0YWxsW10gaW5zdGFsbHM7Ci0KLQlwdWJsaWMgUHJvY2Vzc29yUmVnaXN0cnkoKQotCXsKLQkJaW5pdGlhbGl6ZUZyb21TdG9yYWdlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVGcm9tU3RvcmFnZSgpCi0JewotCQkvLyByZWFkIGZyb20gdGhlIHJlZ2lzdHJ5Ci0JCVByb2Nlc3NvclJlZ2lzdHJ5UmVhZGVyIHJlZ2lzdHJ5UmVhZGVyID0gbmV3IFByb2Nlc3NvclJlZ2lzdHJ5UmVhZGVyKCk7Ci0JCXJlZ2lzdHJ5UmVhZGVyLmFkZENvbmZpZ3ModGhpcyk7Ci0JCS8vIGZpbmQgdGhlIGpyZSBkZWZhdWx0Ci0JCWZvciAoSXRlcmF0b3I8UHJvY2Vzc29ySW5zdGFsbD4gaXRlciA9IGNvbnRyaWJ1dGVkSW5zdGFsbHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotCQl7Ci0JCQlJUHJvY2Vzc29ySW5zdGFsbCBpbnN0YWxsID0gKElQcm9jZXNzb3JJbnN0YWxsKSBpdGVyLm5leHQoKTsKLQkJCWlmIChpbnN0YWxsLmdldElkKCkuZXF1YWxzKFhTTFRSdW50aW1lLkpSRV9ERUZBVUxUX1BST0NFU1NPUl9JRCkpCi0JCQl7Ci0JCQkJanJlRGVmYXVsdFByb2Nlc3NvciA9IGluc3RhbGw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJLy8gcmVhZCBmcm9tIHRoZSBwcmVmZXJlbmNlcwotCQlhZGRQZXJzaXN0ZWRWTXMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkUGVyc2lzdGVkVk1zKCkKLQl7Ci0JCS8vIFRyeSByZXRyaWV2aW5nIHRoZSBWTSBwcmVmZXJlbmNlcyBmcm9tIHRoZSBwcmVmZXJlbmNlIHN0b3JlCi0JCVN0cmluZyB2bVhNTFN0cmluZyA9IExhdW5jaGluZ1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoWFNMVFJ1bnRpbWUuUFJFRl9QUk9DRVNTT1JfWE1MKTsKLQotCQkvLyBJZiB0aGUgcHJlZmVyZW5jZSB3YXMgZm91bmQsIGxvYWQgVk1zIGZyb20gaXQgaW50byBtZW1vcnkKLQkJaWYgKHZtWE1MU3RyaW5nLmxlbmd0aCgpID4gMCkKLQkJewotCQkJdHJ5Ci0JCQl7Ci0JCQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0odm1YTUxTdHJpbmcuZ2V0Qnl0ZXMoKSk7Ci0JCQkJUHJvY2Vzc29yUHJlZmVyZW5jZXMgcHJlZnMgPSBQcm9jZXNzb3JQcmVmZXJlbmNlcy5mcm9tWE1MKGlucHV0U3RyZWFtKTsKLQkJCQlTdHJpbmcgZGVmYXVsdFByb2Nlc3NvcklkID0gcHJlZnMuZ2V0RGVmYXVsdFByb2Nlc3NvcklkKCk7Ci0JCQkJdXNlckluc3RhbGxzID0gcHJlZnMuZ2V0UHJvY2Vzc29ycygpOwotCQkJCWZvciAoSXRlcmF0b3I8SVByb2Nlc3Nvckluc3RhbGw+IGl0ZXIgPSB1c2VySW5zdGFsbHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotCQkJCXsKLQkJCQkJSVByb2Nlc3Nvckluc3RhbGwgaW5zdGFsbCA9IChJUHJvY2Vzc29ySW5zdGFsbCkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChpbnN0YWxsLmdldElkKCkuZXF1YWxzKGRlZmF1bHRQcm9jZXNzb3JJZCkpCi0JCQkJCXsKLQkJCQkJCWRlZmF1bHRQcm9jZXNzb3IgPSBpbnN0YWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChkZWZhdWx0UHJvY2Vzc29yID09IG51bGwpCi0JCQkJewotCQkJCQlmb3IgKEl0ZXJhdG9yPFByb2Nlc3Nvckluc3RhbGw+IGl0ZXIgPSBjb250cmlidXRlZEluc3RhbGxzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLQkJCQkJewotCQkJCQkJSVByb2Nlc3Nvckluc3RhbGwgaW5zdGFsbCA9IChJUHJvY2Vzc29ySW5zdGFsbCkgaXRlci5uZXh0KCk7Ci0JCQkJCQlpZiAoZGVmYXVsdFByb2Nlc3NvciA9PSBudWxsICYmIGluc3RhbGwuZ2V0SWQoKS5lcXVhbHMoZGVmYXVsdFByb2Nlc3NvcklkKSkKLQkJCQkJCXsKLQkJCQkJCQlkZWZhdWx0UHJvY2Vzc29yID0gaW5zdGFsbDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0JCQl7Ci0JCQkJTGF1bmNoaW5nUGx1Z2luLmxvZyhlKTsKLQkJCX0KLQkJfQotCQkvLyBtYWtlIHRoZSBKUkUgdGhlIGRlZmF1bHQgZGVmYXVsdAotCQlpZiAoZGVmYXVsdFByb2Nlc3NvciA9PSBudWxsKQotCQl7Ci0JCQlkZWZhdWx0UHJvY2Vzc29yID0ganJlRGVmYXVsdFByb2Nlc3NvcjsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFByb2Nlc3NvcihTdHJpbmcgYnVuZGxlSWQsIFN0cmluZyBpZCwgU3RyaW5nIGxhYmVsLCBTdHJpbmcgcHJvY2Vzc29yVHlwZUlkLCBTdHJpbmcgY2xhc3NwYXRoLCBTdHJpbmcgZGVidWdnZXJJZCwgU3RyaW5nIHN1cHBvcnRzKQotCXsKLQkJSVByb2Nlc3NvckphcltdIGphcnMgPSBQcm9jZXNzb3JJbnN0YWxsLmNyZWF0ZUphcnMoYnVuZGxlSWQsIGNsYXNzcGF0aCk7Ci0JCWNvbnRyaWJ1dGVkSW5zdGFsbHMuYWRkKG5ldyBQcm9jZXNzb3JJbnN0YWxsKGlkLCBsYWJlbCwgcHJvY2Vzc29yVHlwZUlkLCBqYXJzLCBkZWJ1Z2dlcklkLCBzdXBwb3J0cywgdHJ1ZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFByb2Nlc3NvcihJUHJvY2Vzc29ySW5zdGFsbCBpbnN0YWxsKQotCXsKLQkJaWYgKCFpbnN0YWxsLmlzQ29udHJpYnV0ZWQoKSkKLQkJCXVzZXJJbnN0YWxscy5hZGQoaW5zdGFsbCk7Ci0JCUlQcm9jZXNzb3JJbnN0YWxsW10gbmV3aW5zdGFsbHMgPSBuZXcgSVByb2Nlc3Nvckluc3RhbGxbaW5zdGFsbHMubGVuZ3RoICsgMV07Ci0JCVN5c3RlbS5hcnJheWNvcHkoaW5zdGFsbHMsIDAsIG5ld2luc3RhbGxzLCAwLCBpbnN0YWxscy5sZW5ndGgpOwotCQluZXdpbnN0YWxsc1tpbnN0YWxscy5sZW5ndGhdID0gaW5zdGFsbDsKLQkJaW5zdGFsbHMgPSBuZXdpbnN0YWxsczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVQcm9jZXNzb3IoaW50IGluZGV4KQotCXsKLQkJSVByb2Nlc3Nvckluc3RhbGwgcmVtb3ZlZCA9IGluc3RhbGxzW2luZGV4XTsKLQkJaWYgKCFyZW1vdmVkLmlzQ29udHJpYnV0ZWQoKSkKLQkJCXVzZXJJbnN0YWxscy5yZW1vdmUocmVtb3ZlZCk7Ci0JCUlQcm9jZXNzb3JJbnN0YWxsW10gbmV3aW5zdGFsbHMgPSBuZXcgSVByb2Nlc3Nvckluc3RhbGxbaW5zdGFsbHMubGVuZ3RoIC0gMV07Ci0JCVN5c3RlbS5hcnJheWNvcHkoaW5zdGFsbHMsIDAsIG5ld2luc3RhbGxzLCAwLCBpbmRleCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoaW5zdGFsbHMsIGluZGV4ICsgMSwgbmV3aW5zdGFsbHMsIGluZGV4LCBuZXdpbnN0YWxscy5sZW5ndGggLSBpbmRleCk7Ci0JCWluc3RhbGxzID0gbmV3aW5zdGFsbHM7Ci0JfQotCi0JcHVibGljIElQcm9jZXNzb3JJbnN0YWxsW10gZ2V0UHJvY2Vzc29ycygpCi0JewotCQlpZiAoaW5zdGFsbHMgPT0gbnVsbCkKLQkJewotCQkJaW5zdGFsbHMgPSBuZXcgSVByb2Nlc3Nvckluc3RhbGxbY29udHJpYnV0ZWRJbnN0YWxscy5zaXplKCkgKyB1c2VySW5zdGFsbHMuc2l6ZSgpXTsKLQkJCWludCBzdGFydEluZGV4ID0gMDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29udHJpYnV0ZWRJbnN0YWxscy5zaXplKCk7IGkrKykKLQkJCXsKLQkJCQlpbnN0YWxsc1tpXSA9IChJUHJvY2Vzc29ySW5zdGFsbCkgY29udHJpYnV0ZWRJbnN0YWxscy5nZXQoaSk7Ci0JCQkJc3RhcnRJbmRleCA9IGkgKyAxOwotCQkJfQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1c2VySW5zdGFsbHMuc2l6ZSgpOyBpKyspCi0JCQl7Ci0JCQkJaW5zdGFsbHNbc3RhcnRJbmRleCArIGldID0gKElQcm9jZXNzb3JJbnN0YWxsKSB1c2VySW5zdGFsbHMuZ2V0KGkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpbnN0YWxsczsKLQl9Ci0KLQlwdWJsaWMgSVByb2Nlc3Nvckluc3RhbGxbXSBnZXRQcm9jZXNzb3JzKFN0cmluZyBpZCkKLQl7Ci0JCUlQcm9jZXNzb3JJbnN0YWxsW10gaW5zdGFsbHMgPSBnZXRQcm9jZXNzb3JzKCk7Ci0JCUxpc3Q8SVByb2Nlc3Nvckluc3RhbGw+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8SVByb2Nlc3Nvckluc3RhbGw+KCk7Ci0JCWZvciAoSVByb2Nlc3Nvckluc3RhbGwgdHlwZSA6IGluc3RhbGxzKQotCQl7Ci0JCQlpZiAodHlwZS5nZXRQcm9jZXNzb3JUeXBlKCkuZ2V0SWQoKS5lcXVhbHMoaWQpKQotCQkJCXJlc3VsdC5hZGQodHlwZSk7Ci0JCX0KLQkJcmV0dXJuIChJUHJvY2Vzc29ySW5zdGFsbFtdKSByZXN1bHQudG9BcnJheShuZXcgSVByb2Nlc3Nvckluc3RhbGxbMF0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRQcm9jZXNzb3IoSVByb2Nlc3Nvckluc3RhbGwgZGVmYXVsdEluc3RhbGwpCi0JewotCQlkZWZhdWx0UHJvY2Vzc29yID0gZGVmYXVsdEluc3RhbGw7Ci0JfQotCi0JcHVibGljIElQcm9jZXNzb3JJbnN0YWxsIGdldERlZmF1bHRQcm9jZXNzb3IoKQotCXsKLQkJcmV0dXJuIGRlZmF1bHRQcm9jZXNzb3I7Ci0JfQotCi0JcHVibGljIElQcm9jZXNzb3JJbnN0YWxsIGdldEpSRURlZmF1bHRQcm9jZXNzb3IoKQotCXsKLQkJcmV0dXJuIGpyZURlZmF1bHRQcm9jZXNzb3I7Ci0JfQotCi0JcHVibGljIElQcm9jZXNzb3JJbnN0YWxsW10gZ2V0Q29udHJpYnV0ZWRQcm9jZXNzb3JzKCkKLQl7Ci0JCXJldHVybiAoSVByb2Nlc3Nvckluc3RhbGxbXSkgY29udHJpYnV0ZWRJbnN0YWxscy50b0FycmF5KG5ldyBJUHJvY2Vzc29ySW5zdGFsbFswXSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvcmVnaXN0cnkvUHJvY2Vzc29yUmVnaXN0cnlSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL3JlZ2lzdHJ5L1Byb2Nlc3NvclJlZ2lzdHJ5UmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3YWRhOGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvcmVnaXN0cnkvUHJvY2Vzc29yUmVnaXN0cnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nLnJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZy5MYXVuY2hpbmdQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBQcm9jZXNzb3JSZWdpc3RyeVJlYWRlciBleHRlbmRzIEFic3RyYWN0UmVnaXN0cnlSZWFkZXIKLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfcHJvY2Vzc29yID0gInByb2Nlc3NvciI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0lEID0gImlkIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfTEFCRUwgPSAibGFiZWwiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9UWVBFX0lEID0gInByb2Nlc3NvclR5cGVJZCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0RFQlVHR0VSX0lEID0gImRlYnVnZ2VySWQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DTEFTU1BBVEggPSAiY2xhc3NwYXRoIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfU1VQUE9SVFMgPSAic3VwcG9ydHMiOwotCi0JcHJpdmF0ZSBQcm9jZXNzb3JSZWdpc3RyeSByZWdpc3RyeTsKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KQotCXsKLQkJaWYgKCFlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoVEFHX3Byb2Nlc3NvcikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJU3RyaW5nIGlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0lEKTsKLQkJaWYgKGlkID09IG51bGwpCi0JCXsKLQkJCWxvZ01pc3NpbmdBdHRyaWJ1dGUoZWxlbWVudCwgQVRUX0lEKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJU3RyaW5nIGxhYmVsID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0xBQkVMKTsKLQkJaWYgKGxhYmVsID09IG51bGwpCi0JCXsKLQkJCWxvZ01pc3NpbmdBdHRyaWJ1dGUoZWxlbWVudCwgQVRUX0xBQkVMKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJU3RyaW5nIHByb2Nlc3NvclR5cGVJZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9UWVBFX0lEKTsKLQkJaWYgKHByb2Nlc3NvclR5cGVJZCA9PSBudWxsKQotCQl7Ci0JCQlsb2dNaXNzaW5nQXR0cmlidXRlKGVsZW1lbnQsIEFUVF9UWVBFX0lEKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJU3RyaW5nIGNsYXNzcGF0aCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9DTEFTU1BBVEgpOwotCQlpZiAoY2xhc3NwYXRoID09IG51bGwpCi0JCXsKLQkJCWxvZ01pc3NpbmdBdHRyaWJ1dGUoZWxlbWVudCwgQVRUX0NMQVNTUEFUSCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCVN0cmluZyBkZWJ1Z2dlcklkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0RFQlVHR0VSX0lEKTsKLQotCQlTdHJpbmcgc3VwcG9ydHMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfU1VQUE9SVFMpOwotCQlpZiAoY2xhc3NwYXRoID09IG51bGwpCi0JCXsKLQkJCWxvZ01pc3NpbmdBdHRyaWJ1dGUoZWxlbWVudCwgQVRUX1NVUFBPUlRTKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcmVnaXN0cnkuYWRkUHJvY2Vzc29yKGVsZW1lbnQuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCksIGlkLCBsYWJlbCwgcHJvY2Vzc29yVHlwZUlkLCBjbGFzc3BhdGgsIGRlYnVnZ2VySWQsIHN1cHBvcnRzKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWFkRWxlbWVudChQcm9jZXNzb3JSZWdpc3RyeSByZWdpc3RyeSwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpCi0JewotCQl0aGlzLnJlZ2lzdHJ5ID0gcmVnaXN0cnk7Ci0JCXJlYWRFbGVtZW50KGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZENvbmZpZ3MoUHJvY2Vzc29yUmVnaXN0cnkgcmVnaXN0cnkpCi0JewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQl0aGlzLnJlZ2lzdHJ5ID0gcmVnaXN0cnk7Ci0JCXJlYWRSZWdpc3RyeShleHRlbnNpb25SZWdpc3RyeSwgTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCwgInByb2Nlc3NvciIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL3JlZ2lzdHJ5L1Byb2Nlc3NvclR5cGVSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvcmVnaXN0cnkvUHJvY2Vzc29yVHlwZVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NWE2OTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvcmVnaXN0cnkvUHJvY2Vzc29yVHlwZVJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmcucmVnaXN0cnk7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nLkZlYXR1cmVQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZy5MYXVuY2hpbmdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmcuT3V0cHV0UHJvcGVydHlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZy5Qcm9jZXNzb3JUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLklQcm9jZXNzb3JUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLlhTTFRSdW50aW1lOwotCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc29yVHlwZVJlZ2lzdHJ5Ci17Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ19TVUZGSVggPSAiLkRFU0MiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfU1VGRklYID0gIi5UWVBFIjsKLQotCXByaXZhdGUgZmluYWwgTGlzdDxJQ29uZmlndXJhdGlvbkVsZW1lbnQ+IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxJQ29uZmlndXJhdGlvbkVsZW1lbnQ+KCk7Ci0JcHJpdmF0ZSBJUHJvY2Vzc29yVHlwZVtdIGluc3RhbGxUeXBlczsKLQotCXB1YmxpYyBQcm9jZXNzb3JUeXBlUmVnaXN0cnkoKQotCXsKLQkJUHJvY2Vzc29yVHlwZVJlZ2lzdHJ5UmVhZGVyIHJlZ2lzdHJ5UmVhZGVyID0gbmV3IFByb2Nlc3NvclR5cGVSZWdpc3RyeVJlYWRlcigpOwotCQlyZWdpc3RyeVJlYWRlci5hZGRDb25maWdzKHRoaXMpOwotCX0KLQotCXB1YmxpYyBJUHJvY2Vzc29yVHlwZVtdIGdldFByb2Nlc3NvclR5cGVzKCkKLQl7Ci0JCWlmIChpbnN0YWxsVHlwZXMgPT0gbnVsbCkKLQkJewotCQkJTGlzdDxQcm9jZXNzb3JUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8UHJvY2Vzc29yVHlwZT4oKTsKLQkJCVN0cmluZyBmZWF0dXJlWE1MU3RyaW5nID0gTGF1bmNoaW5nUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldFN0cmluZyhYU0xUUnVudGltZS5QUkVGX0ZFQVRVUkVfWE1MKTsKLQkJCS8vIElmIHRoZSBwcmVmZXJlbmNlIHdhcyBmb3VuZCwgbG9hZCBWTXMgZnJvbSBpdCBpbnRvIG1lbW9yeQotCQkJRmVhdHVyZVByZWZlcmVuY2VzIHByZWZzID0gbnVsbDsKLQkJCWlmIChmZWF0dXJlWE1MU3RyaW5nLmxlbmd0aCgpID4gMCkKLQkJCXsKLQkJCQl0cnkKLQkJCQl7Ci0JCQkJCUJ5dGVBcnJheUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGZlYXR1cmVYTUxTdHJpbmcuZ2V0Qnl0ZXMoKSk7Ci0JCQkJCXByZWZzID0gRmVhdHVyZVByZWZlcmVuY2VzLmZyb21YTUwoaW5wdXRTdHJlYW0pOwotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotCQkJCXsKLQkJCQkJTGF1bmNoaW5nUGx1Z2luLmxvZyhlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCVN0cmluZyBwcm9wWE1MU3RyaW5nID0gTGF1bmNoaW5nUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldFN0cmluZyhYU0xUUnVudGltZS5QUkVGX09VVFBVVF9QUk9QRVJUSUVTX1hNTCk7Ci0JCQkvLyBJZiB0aGUgcHJlZmVyZW5jZSB3YXMgZm91bmQsIGxvYWQgVk1zIGZyb20gaXQgaW50byBtZW1vcnkKLQkJCU91dHB1dFByb3BlcnR5UHJlZmVyZW5jZXMgb3V0cHV0cHJlZnMgPSBudWxsOwotCQkJaWYgKHByb3BYTUxTdHJpbmcubGVuZ3RoKCkgPiAwKQotCQkJewotCQkJCXRyeQotCQkJCXsKLQkJCQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocHJvcFhNTFN0cmluZy5nZXRCeXRlcygpKTsKLQkJCQkJb3V0cHV0cHJlZnMgPSBPdXRwdXRQcm9wZXJ0eVByZWZlcmVuY2VzLmZyb21YTUwoaW5wdXRTdHJlYW0pOwotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotCQkJCXsKLQkJCQkJTGF1bmNoaW5nUGx1Z2luLmxvZyhlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWZvciAoSXRlcmF0b3I8SUNvbmZpZ3VyYXRpb25FbGVtZW50PiBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotCQkJewotCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gKElDb25maWd1cmF0aW9uRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQkJU3RyaW5nIGlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoUHJvY2Vzc29yVHlwZVJlZ2lzdHJ5UmVhZGVyLkFUVF9JRCk7Ci0JCQkJU3RyaW5nIGxhYmVsID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoUHJvY2Vzc29yVHlwZVJlZ2lzdHJ5UmVhZGVyLkFUVF9MQUJFTCk7Ci0JCQkJU3RyaW5nIHRyYW5zRmFjdG9yeU5hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShQcm9jZXNzb3JUeXBlUmVnaXN0cnlSZWFkZXIuQVRUX1RSQU5TRk9STUVSX0ZBQ1RPUllfTkFNRSk7Ci0JCQkJTWFwPFN0cmluZywgU3RyaW5nPiBmZWF0dXJlVmFsdWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCQkJUHJvcGVydGllcyBwcm9wZXJ0eVZhbHVlcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCQkJaWYgKHByZWZzICE9IG51bGwgJiYgcHJlZnMuZ2V0RmVhdHVyZXNWYWx1ZXMoaWQpICE9IG51bGwpCi0JCQkJCWZlYXR1cmVWYWx1ZXMucHV0QWxsKHByZWZzLmdldEZlYXR1cmVzVmFsdWVzKGlkKSk7Ci0JCQkJaWYgKG91dHB1dHByZWZzICE9IG51bGwgJiYgb3V0cHV0cHJlZnMuZ2V0T3V0cHV0UHJvcGVydHlWYWx1ZXMoaWQpICE9IG51bGwpCi0JCQkJCXByb3BlcnR5VmFsdWVzLnB1dEFsbChvdXRwdXRwcmVmcy5nZXRPdXRwdXRQcm9wZXJ0eVZhbHVlcyhpZCkpOwotCi0JCQkJU3RyaW5nIG91dHB1dFByb3BlcnRpZXMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShQcm9jZXNzb3JUeXBlUmVnaXN0cnlSZWFkZXIuQVRUX09VVFBVVF9QUk9QRVJUSUVTKTsKLQkJCQlVUkwgb3V0cHV0UHJvcGVydGllc1VSTCA9IEZpbGVMb2NhdG9yLmZpbmQoUGxhdGZvcm0uZ2V0QnVuZGxlKGVsZW1lbnQuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkpLCBuZXcgUGF0aChvdXRwdXRQcm9wZXJ0aWVzKSwgbnVsbCk7Ci0JCQkJU3RyaW5nIGZlYXR1cmVQcm9wZXJ0aWVzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoUHJvY2Vzc29yVHlwZVJlZ2lzdHJ5UmVhZGVyLkFUVF9GRUFUVVJFX1BST1BFUlRJRVMpOwotCQkJCVVSTCBmZWF0dXJlUHJvcGVydGllc1VSTCA9IEZpbGVMb2NhdG9yLmZpbmQoUGxhdGZvcm0uZ2V0QnVuZGxlKGVsZW1lbnQuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkpLCBuZXcgUGF0aChmZWF0dXJlUHJvcGVydGllcyksIG51bGwpOwotCQkJCQotCQkJCXR5cGVzLmFkZChuZXcgUHJvY2Vzc29yVHlwZShpZCwgbGFiZWwsIGZlYXR1cmVQcm9wZXJ0aWVzVVJMLCBvdXRwdXRQcm9wZXJ0aWVzVVJMLCBmZWF0dXJlVmFsdWVzLCBwcm9wZXJ0eVZhbHVlcywgdHJhbnNGYWN0b3J5TmFtZSkpOwotCQkJfQotCQkJaW5zdGFsbFR5cGVzID0gKElQcm9jZXNzb3JUeXBlW10pIHR5cGVzLnRvQXJyYXkobmV3IElQcm9jZXNzb3JUeXBlWzBdKTsKLQkJfQotCQlyZXR1cm4gaW5zdGFsbFR5cGVzOwotCX0KLQotCXB1YmxpYyBJUHJvY2Vzc29yVHlwZVtdIGdldFByb2Nlc3NvclR5cGVzRXhjbEpSRURlZmF1bHQoKQotCXsKLQkJSVByb2Nlc3NvclR5cGVbXSBpbnN0YWxsVHlwZXMgPSBnZXRQcm9jZXNzb3JUeXBlcygpOwotCQlMaXN0PElQcm9jZXNzb3JUeXBlPiBleGNsVHlwZXMgPSBuZXcgQXJyYXlMaXN0PElQcm9jZXNzb3JUeXBlPihpbnN0YWxsVHlwZXMubGVuZ3RoIC0gMSk7Ci0JCWZvciAoSVByb2Nlc3NvclR5cGUgdHlwZSA6IGluc3RhbGxUeXBlcykKLQkJewotCQkJaWYgKCF0eXBlLmlzSlJFRGVmYXVsdCgpKQotCQkJCWV4Y2xUeXBlcy5hZGQodHlwZSk7Ci0JCX0KLQkJcmV0dXJuIChJUHJvY2Vzc29yVHlwZVtdKSBleGNsVHlwZXMudG9BcnJheShuZXcgSVByb2Nlc3NvclR5cGVbMF0pOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFR5cGUoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpCi0JewotCQllbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIElQcm9jZXNzb3JUeXBlIGdldFByb2Nlc3NvclR5cGUoU3RyaW5nIGlkKQotCXsKLQkJSVByb2Nlc3NvclR5cGVbXSBpbnN0YWxsVHlwZXMgPSBnZXRQcm9jZXNzb3JUeXBlcygpOwotCQlmb3IgKElQcm9jZXNzb3JUeXBlIHR5cGUgOiBpbnN0YWxsVHlwZXMpCi0JCXsKLQkJCWlmICh0eXBlLmdldElkKCkuZXF1YWxzKGlkKSkKLQkJCQlyZXR1cm4gdHlwZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9yZWdpc3RyeS9Qcm9jZXNzb3JUeXBlUmVnaXN0cnlSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL3JlZ2lzdHJ5L1Byb2Nlc3NvclR5cGVSZWdpc3RyeVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmY3NjdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL3JlZ2lzdHJ5L1Byb2Nlc3NvclR5cGVSZWdpc3RyeVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmcucmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nLkxhdW5jaGluZ1BsdWdpbjsKLQotcHVibGljIGNsYXNzIFByb2Nlc3NvclR5cGVSZWdpc3RyeVJlYWRlciBleHRlbmRzIEFic3RyYWN0UmVnaXN0cnlSZWFkZXIKLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfcHJvY2Vzc29yVHlwZSA9ICJwcm9jZXNzb3JUeXBlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfSUQgPSAiaWQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9MQUJFTCA9ICJsYWJlbCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1RSQU5TRk9STUVSX0ZBQ1RPUllfTkFNRSA9ICJ0cmFuc2Zvcm1lckZhY3RvcnkiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9PVVRQVVRfUFJPUEVSVElFUyA9ICJvdXRwdXRQcm9wZXJ0aWVzIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfRkVBVFVSRV9QUk9QRVJUSUVTID0gImZlYXR1cmVQcm9wZXJ0aWVzIjsKLQotCXByaXZhdGUgUHJvY2Vzc29yVHlwZVJlZ2lzdHJ5IHJlZ2lzdHJ5OwotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpCi0JewotCQlpZiAoIWVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhUQUdfcHJvY2Vzc29yVHlwZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJU3RyaW5nIGlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0lEKTsKLQkJaWYgKGlkID09IG51bGwpCi0JCXsKLQkJCWxvZ01pc3NpbmdBdHRyaWJ1dGUoZWxlbWVudCwgQVRUX0lEKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJU3RyaW5nIGxhYmVsID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0xBQkVMKTsKLQkJaWYgKGxhYmVsID09IG51bGwpCi0JCXsKLQkJCWxvZ01pc3NpbmdBdHRyaWJ1dGUoZWxlbWVudCwgQVRUX0xBQkVMKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJU3RyaW5nIG91dHB1dFByb3BlcnRpZXMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfT1VUUFVUX1BST1BFUlRJRVMpOwotCQlpZiAob3V0cHV0UHJvcGVydGllcyA9PSBudWxsKQotCQl7Ci0JCQlsb2dNaXNzaW5nQXR0cmlidXRlKGVsZW1lbnQsIEFUVF9PVVRQVVRfUFJPUEVSVElFUyk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCVN0cmluZyBmZWF0dXJlUHJvcGVydGllcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9GRUFUVVJFX1BST1BFUlRJRVMpOwotCQlpZiAoZmVhdHVyZVByb3BlcnRpZXMgPT0gbnVsbCkKLQkJewotCQkJbG9nTWlzc2luZ0F0dHJpYnV0ZShlbGVtZW50LCBBVFRfRkVBVFVSRV9QUk9QRVJUSUVTKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcmVnaXN0cnkuYWRkVHlwZShlbGVtZW50KTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWFkRWxlbWVudChQcm9jZXNzb3JUeXBlUmVnaXN0cnkgcmVnaXN0cnksIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KQotCXsKLQkJdGhpcy5yZWdpc3RyeSA9IHJlZ2lzdHJ5OwotCQlyZWFkRWxlbWVudChlbGVtZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb25maWdzKFByb2Nlc3NvclR5cGVSZWdpc3RyeSByZWdpc3RyeSkKLQl7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCXRoaXMucmVnaXN0cnkgPSByZWdpc3RyeTsKLQkJcmVhZFJlZ2lzdHJ5KGV4dGVuc2lvblJlZ2lzdHJ5LCBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lELCAicHJvY2Vzc29yVHlwZSIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL0lEZWJ1Z2dlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvSURlYnVnZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNDdiZTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvSURlYnVnZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZzsKLQotLyoqCi0gKiBBbiBYU0xUIGRlYnVnZ2VyLiBUeXBpY2FsbHkgdGhpcyB3aWxsIGhhdmUgYmVlbiAKLSAqIGNvbnRyaWJ1dGVkIHZpYSB0aGUgPGNvZGU+b3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuZGVidWdnZXI8L2NvZGU+IGV4dGVuc2lvbiBwb2ludC4KLSAqIAotICogQGF1dGhvciBEb3VnIFNhdGNod2VsbAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElEZWJ1Z2dlcgotewotCS8qKgotCSAqIEdldCB0aGUgdW5pcXVlIGlkIGZvciB0aGlzIGRlYnVnZ2VyLgotCSAqIEByZXR1cm4gZGVidWdnZXIgaWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIEdldCB0aGUgc2V0IG9mIGJ1bmRsZS1yZWxhdGl2ZSBqYXIgZmlsZXMgdG8gYWRkIHRvIHRoZSBjbGFzc3BhdGguIAotCSAqIEByZXR1cm4gYXJyYXkgb2YgYnVuZGxlLXJlbGF0aXZlIGphcnMKLQkgKi8KLQlTdHJpbmdbXSBnZXRDbGFzc1BhdGgoKTsKLQotCS8qKgotCSAqIEdldCBhIHVuaXF1ZSBuYW1lIGZvciB0aGlzIGRlYnVnZ2VyCi0JICogQHJldHVybiB0aGUgbmFtZSBmb3IgdGhlIGRlYnVnZ2VyCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIEdldCB0aGUgcHJvY2Vzc29yIHR5cGUgdGhhdCB0aGlzIGRlYnVnZ2VyIGlzIGFzc29jaWF0ZWQgd2l0aAotCSAqIEByZXR1cm4gdGhlIHByb2Nlc3NvciB0eXBlCi0JICovCi0JSVByb2Nlc3NvclR5cGUgZ2V0UHJvY2Vzc29yVHlwZSgpOwotCi0JLyoqCi0JICogR2V0IHRoZSBjbGFzcyBuYW1lIGZvciB0aGlzIGRlYnVnZ2VyCi0JICogQHJldHVybiB0aGUgY2xhc3MgbmFtZQotCSAqLwotCVN0cmluZyBnZXRDbGFzc05hbWUoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL0lGZWF0dXJlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9JRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGQ4OTNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL0lGZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi0vKioKLSAqIEEgZmVhdHVyZSBzdXBwb3J0ZWQgYnkgYW4gWFNMVCBwcm9jZXNzb3IuIAotICogCi0gKiBAYXV0aG9yIERvdWcgU2F0Y2h3ZWxsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUZlYXR1cmUKLXsKLQkvKioKLQkgKiBDb25zdGFudCBmb3IgZmVhdHVyZXMgb2YgdHlwZSA8Y29kZT5zdHJpbmc8L2NvZGU+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICovCi0JU3RyaW5nIFRZUEVfU1RSSU5HID0gInN0cmluZyI7Ci0JCi0JLyoqCi0JICogQ29uc3RhbnQgZm9yIGZlYXR1cmVzIG9mIHR5cGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKi8KLQlTdHJpbmcgVFlQRV9CT09MRUFOID0gImJvb2xlYW4iOwotCQotCS8qKgotCSAqIENvbnN0YW50IGZvciBmZWF0dXJlcyBvZiB0eXBlIDxjb2RlPmludDwvY29kZT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKi8KLQlTdHJpbmcgVFlQRV9JTlQgPSAiaW50IjsKLQkKLQkvKioKLQkgKiBDb25zdGFudCBmb3IgZmVhdHVyZXMgb2YgdHlwZSA8Y29kZT5kb3VibGU8L2NvZGU+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICovCi0JU3RyaW5nIFRZUEVfRE9VQkxFID0gImRvdWJsZSI7Ci0JCi0JLyoqCi0JICogQ29uc3RhbnQgZm9yIGZlYXR1cmVzIG9mIHR5cGUgPGNvZGU+ZmxvYXQ8L2NvZGU+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICovCi0JU3RyaW5nIFRZUEVfRkxPQVQgPSAiZmxvYXQiOwotCQotCS8qKgotCSAqIENvbnN0YW50IGZvciBmZWF0dXJlcyBvZiB0eXBlIDxjb2RlPmNsYXNzPC9jb2RlPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqLwotCVN0cmluZyBUWVBFX0NMQVNTID0gImNsYXNzIjsKLQkKLQkvKioKLQkgKiBDb25zdGFudCBmb3IgZmVhdHVyZXMgb2YgdHlwZSA8Y29kZT5vYmplY3Q8L2NvZGU+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICovCi0JU3RyaW5nIFRZUEVfT0JKRUNUID0gIm9iamVjdCI7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIFVSSSBmb3IgdGhpcyBmZWF0dXJlCi0JICogQHJldHVybiB0aGUgZmVhdHVyZSBVUkkKLQkgKi8KLQlTdHJpbmcgZ2V0VVJJKCk7Ci0KLQkvKioKLQkgKiBHZXQgYSBkZXNjcmlwdGlvbiBmb3IgdGhpcyBmZWF0dXJlCi0JICogQHJldHVybiB0aGUgZmVhdHVyZSBkZXNjcmlwdGlvbgotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogR2V0IHRoZSB0eXBlIG9mIHRoaXMgZmVhdHVyZS4gV2lsbCBtYXRjaCBvbmUgb2YgdGhlIFRZUEUgY29uc3RhbnRzIGluIHRoaXMgaW50ZXJmYWNlLgotCSAqIEByZXR1cm4gdGhlIGZlYXR1cmUgdHlwZTogb25lIG9mIDxjb2RlPlRZUEVfU1RSSU5HPC9jb2RlPiwgPGNvZGU+VFlQRV9CT09MRUFOPC9jb2RlPiwgCi0JICogPGNvZGU+VFlQRV9JTlQ8L2NvZGU+LCA8Y29kZT5UWVBFX0RPVUJMRTwvY29kZT4sIDxjb2RlPlRZUEVfRkxPQVQ8L2NvZGU+LCA8Y29kZT5UWVBFX0NMQVNTPC9jb2RlPiwgCi0JICogb3IgPGNvZGU+VFlQRV9PQkpFQ1Q8L2NvZGU+Ci0JICovCi0JU3RyaW5nIGdldFR5cGUoKTsKLQotCS8qKgotCSAqIERldGVybWluZSB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBpcyBhIHZhbGlkIG9uZSBmb3IgdGhpcyBmZWF0dXJlLgotCSAqIEByZXR1cm4gYW4gPGNvZGU+SVN0YXR1czwvY29kZT4gd2l0aCBzZXZlcml0eSA8Y29kZT5PSzwvY29kZT4gaWYgdmFsaWQsIG9yIDxjb2RlPkVSUk9SPC9jb2RlPiBpZiBpbnZhbGlkLgotCSAqLwotCUlTdGF0dXMgdmFsaWRhdGVWYWx1ZShTdHJpbmcgdmFsdWUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvSU91dHB1dFByb3BlcnR5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9JT3V0cHV0UHJvcGVydHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUzZWJlNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9JT3V0cHV0UHJvcGVydHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nOwotCi0vKioKLSAqIEFuIG91dHB1dCBwcm9wZXJ0eSBzdXBwb3J0ZWQgYnkgYW4gWFNMVCBwcm9jZXNzb3IuIAotICogCi0gKiBAYXV0aG9yIERvdWcgU2F0Y2h3ZWxsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU91dHB1dFByb3BlcnR5Ci17Ci0JLyoqCi0JICogR2V0IHRoZSBVUkkgb2YgdGhpcyBvdXRwdXQgcHJvcGVydHkuIAotCSAqIEByZXR1cm4gYSB1bmlxdWUgVVJJCi0JICovCi0JU3RyaW5nIGdldFVSSSgpOwotCi0JLyoqCi0JICogR2V0IGEgZGVzY3JpcHRpb24gZm9yIHRoaXMgb3V0cHV0IHByb3BlcnR5LiAKLQkgKiBAcmV0dXJuIGEgZGVzY3JpcHRpb24KLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL0lQcm9jZXNzb3JJbnN0YWxsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9JUHJvY2Vzc29ySW5zdGFsbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmU3MGU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL0lQcm9jZXNzb3JJbnN0YWxsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZzsKLQotLyoqCi0gKiBBbiBpbnN0YW5jZSBvZiBhbiBYU0xUIHByb2Nlc3NvciAoZS5nLiBYYWxhbiAyLjcuMCkuCi0gKiAKLSAqIEBzZWUgSVByb2Nlc3Nvckluc3RhbGwKLSAqIEBhdXRob3IgRG91ZyBTYXRjaHdlbGwKLSAqLwotcHVibGljIGludGVyZmFjZSBJUHJvY2Vzc29ySW5zdGFsbAotewotCS8qKgotCSAqIEdldCB0aGUgdW5xaXVlIGlkIG9mIHRoaXMgaW5zdGFsbAotCSAqIEByZXR1cm4gdGhlIHVuaXF1ZSBpZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogR2V0IHRoZSBuYW1lIG9mIHRoaXMgaW5zdGFsbAotCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBpbnN0YWxsCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIEdldCB0aGUgdGhlIHByb2Nlc3NvciB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGluc3RhbGwKLQkgKiBAcmV0dXJuIHRoZSBwcm9jZXNzb3IgdHlwZSBpZAotCSAqLwotCUlQcm9jZXNzb3JUeXBlIGdldFByb2Nlc3NvclR5cGUoKTsKLQotCS8qKgotCSAqIEdldCB0aGUgamFyIGZpbGVzIGZvciB0aGlzIHByb2Nlc3NvcgotCSAqIEByZXR1cm4gYSBzZXQgb2YgamFyIGZpbGVzCi0JICovCi0JSVByb2Nlc3NvckphcltdIGdldFByb2Nlc3NvckphcnMoKTsKLQotCS8qKgotCSAqIEdldCB3aGV0aGVyIHRoaXMgaW5zdGFsbCBoYXMgYmVlbiBjb250cmlidXRlZCB2aWEgdGhlIDxjb2RlPm9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLnByb2Nlc3NvcjwvY29kZT4gZXh0ZW5zaW9uIHBvaW50LgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgY29udHJpYnV0ZWQgdmlhIHRoZSBleHRlbnNpb24gcG9pbnQsIG90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICovCi0JYm9vbGVhbiBpc0NvbnRyaWJ1dGVkKCk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIFhTTFQgdmVyc2lvbnMKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaW5zdGFsbCBoYXMgYSBkZWJ1Z2dlciwgb3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKi8KLQkvLyBUT0RPIGRlcHJlY2F0ZSBhbmQgdXNlIGJvb2xlYW4gc3VwcG9ydHMgaW5zdGFlZAotCVN0cmluZyBnZXRTdXBwb3J0cygpOwotCi0JLyoqCi0JICogR2V0IHdoZXRoZXIgdGhpcyBpbnN0YWxsIHN1cHBvcnRzIHRoZSBzcGVjaWZpZWQgeHNsdCB2ZXJzaW9uLgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpbnN0YWxsIHN1cHBvcnRzIHRoZSB2ZXJzaW9uLCBvdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+LgotCSAqLwotCWJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHhzbHRWZXJzaW9uKTsKLQotCS8qKgotCSAqIEdldCB0aGUgZGVidWdnZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW5zdGFsbAotCSAqIEByZXR1cm4gdGhlIGRlYnVnZ2VyLCBvciBudWxsIGlmIG5vIGRlYnVnZ2VyIGhhcyBiZWVuIHNldAotCSAqLwotCUlEZWJ1Z2dlciBnZXREZWJ1Z2dlcigpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvSVByb2Nlc3Nvckludm9rZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL0lQcm9jZXNzb3JJbnZva2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4N2U0NDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvSVByb2Nlc3Nvckludm9rZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nOwotCi1wdWJsaWMgaW50ZXJmYWNlIElQcm9jZXNzb3JJbnZva2VyCi17Ci0JU3RyaW5nIGdldElkKCk7Ci0KLQlTdHJpbmcgZ2V0SW52b2tlckNsYXNzTmFtZSgpOwotCi0JU3RyaW5nW10gZ2V0Q2xhc3NwYXRoRW50cmllcygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvSVByb2Nlc3Nvckphci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvSVByb2Nlc3Nvckphci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDJkYzVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL0lQcm9jZXNzb3JKYXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotCi0vKioKLSAqIEEgamFyIGZpbGUgZm9yIGFuIFhTTFQgcHJvY2Vzc29yCi0gKiAKLSAqIEBzZWUgSVByb2Nlc3Nvckluc3RhbGwKLSAqIEBhdXRob3IgRG91ZyBTYXRjaHdlbGwKLSAqLwotcHVibGljIGludGVyZmFjZSBJUHJvY2Vzc29ySmFyCi17Ci0JLyoqCi0JICogVGhlIHBhdGggbWF5IGJlIHJlbGF0aXZlIG9yIGFic29sdXRlOyBpbiB0aGUgd29ya3NwYWNlIG9yIGV4dGVybmFsLgotCSAqIEByZXR1cm4gdGhlIHBhdGggdG8gdGhpcyBqYXIKLQkgKi8KLQlJUGF0aCBnZXRQYXRoKCk7Ci0KLQkvKioKLQkgKiBUaGUgVVJMIHdpbGwgYWx3YXlzIGJlIGFic29sdXRlIGFuZCBjYW4gYmUgb3BlbmVkLgotCSAqIEByZXR1cm4gYSBVUkwgdG8gdGhlIGphcgotCSAqLwotCVVSTCBhc1VSTCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvSVByb2Nlc3NvclR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL0lQcm9jZXNzb3JUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MThhMTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvSVByb2Nlc3NvclR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotLyoqCi0gKiBBIHBhcnRpY3VsYXIgdHlwZSBvZiBYU0xUIFByb2Nlc3NvciAoZS5nLiBYYWxhbikgZm9yIHdoaWNoIHRoZXJlIG1heSBiZSBhbnkgbnVtYmVyIG9mIGluc3RhbGxzLgotICogCi0gKiBAc2VlIElQcm9jZXNzb3JJbnN0YWxsCi0gKiBAYXV0aG9yIERvdWcgU2F0Y2h3ZWxsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVByb2Nlc3NvclR5cGUKLXsKLQlTdHJpbmcgZ2V0SWQoKTsKLQotCVN0cmluZyBnZXRMYWJlbCgpOwotCi0JYm9vbGVhbiBpc0pSRURlZmF1bHQoKTsKLQotCVN0cmluZyBnZXRUcmFuc2Zvcm1lckZhY3RvcnlOYW1lKCk7Ci0KLQlJRmVhdHVyZVtdIGdldEZlYXR1cmVzKCk7Ci0KLQlNYXA8U3RyaW5nLCBTdHJpbmc+IGdldEZlYXR1cmVWYWx1ZXMoKTsKLQotCUlPdXRwdXRQcm9wZXJ0eVtdIGdldE91dHB1dFByb3BlcnRpZXMoKTsKLQotCVByb3BlcnRpZXMgZ2V0T3V0cHV0UHJvcGVydHlWYWx1ZXMoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL1Byb2Nlc3Nvckluc3RhbGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL1Byb2Nlc3Nvckluc3RhbGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODczZDZjMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9Qcm9jZXNzb3JJbnN0YWxsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmc7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nLkxhdW5jaGluZ1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZy5QbHVnaW5Qcm9jZXNzb3JKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmcuVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBQcm9jZXNzb3JJbnN0YWxsIGltcGxlbWVudHMgSVByb2Nlc3Nvckluc3RhbGwKLXsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBpZDsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCXByaXZhdGUgU3RyaW5nIHR5cGU7Ci0JcHJpdmF0ZSBJUHJvY2Vzc29ySmFyW10gamFyczsKLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gY29udHJpYnV0ZWQ7Ci0JcHJpdmF0ZSBTdHJpbmcgZGVidWdnZXJJZDsKLQlwcml2YXRlIFN0cmluZyBzdXBwb3J0czsKLQotCXB1YmxpYyBQcm9jZXNzb3JJbnN0YWxsKFN0cmluZyBpZCwgU3RyaW5nIGxhYmVsLCBTdHJpbmcgdHlwZUlkLCBJUHJvY2Vzc29ySmFyW10gamFycywgU3RyaW5nIGRlYnVnZ2VySWQsIFN0cmluZyBzdXBwb3J0cywgYm9vbGVhbiBjb250cmlidXRlZCkKLQl7Ci0JCXRoaXMuaWQgPSBpZDsKLQkJbmFtZSA9IGxhYmVsOwotCQl0eXBlID0gdHlwZUlkOwotCQl0aGlzLmRlYnVnZ2VySWQgPSBkZWJ1Z2dlcklkOwotCQl0aGlzLmNvbnRyaWJ1dGVkID0gY29udHJpYnV0ZWQ7Ci0JCXRoaXMuamFycyA9IGphcnM7Ci0JCXRoaXMuc3VwcG9ydHMgPSBzdXBwb3J0czsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkKLQl7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkKLQl7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCi0JcHVibGljIElQcm9jZXNzb3JKYXJbXSBnZXRQcm9jZXNzb3JKYXJzKCkKLQl7Ci0JCXJldHVybiBqYXJzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByb2Nlc3NvckphcnMoSVByb2Nlc3NvckphcltdIGphcnMpCi0JewotCQl0aGlzLmphcnMgPSBqYXJzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvY2Vzc29yVHlwZUlkKCkKLQl7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCXB1YmxpYyBJUHJvY2Vzc29yVHlwZSBnZXRQcm9jZXNzb3JUeXBlKCkKLQl7Ci0JCXJldHVybiBYU0xUUnVudGltZS5nZXRQcm9jZXNzb3JUeXBlKHR5cGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByb2Nlc3NvclR5cGVJZChTdHJpbmcgaWQpCi0JewotCQl0eXBlID0gaWQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDb250cmlidXRlZCgpCi0JewotCQlyZXR1cm4gY29udHJpYnV0ZWQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJUHJvY2Vzc29ySmFyW10gY3JlYXRlSmFycyhTdHJpbmcgYnVuZGxlSWQsIFN0cmluZyBjbGFzc3BhdGgpCi0JewotCQlJUHJvY2Vzc29ySmFyW10gamFyczsKLQkJaWYgKGNsYXNzcGF0aCA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBJUHJvY2Vzc29ySmFyWzBdOwotCQlTdHJpbmdbXSBqYXJzdHJpbmcgPSBjbGFzc3BhdGguc3BsaXQoIjsiKTsKLQkJamFycyA9IG5ldyBJUHJvY2Vzc29ySmFyW2phcnN0cmluZy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGphcnN0cmluZy5sZW5ndGg7IGkrKykKLQkJewotCQkJU3RyaW5nIGphciA9IGphcnN0cmluZ1tpXTsKLQkJCXRyeQotCQkJewotCQkJCWlmIChqYXIuc3RhcnRzV2l0aCgiJHtlY2xpcHNlX29yYml0OiIpICYmIGphci5lbmRzV2l0aCgifSIpKQotCQkJCXsKLQkJCQkJamFyID0gamFyLnN1YnN0cmluZygiJHtlY2xpcHNlX29yYml0OiIubGVuZ3RoKCkpOwotCQkJCQlqYXIgPSBqYXIuc3Vic3RyaW5nKDAsamFyLmxlbmd0aCgpLTEpOwotCQkJCQkvL2phciA9IFV0aWxzLmdldEZpbGVMb2NhdGlvbihqYXIsIiIpOwotCQkJCQlqYXJzW2ldID0gbmV3IFBsdWdpblByb2Nlc3NvckphcihqYXIsIG51bGwpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlqYXIgPSBVdGlscy5nZXRGaWxlTG9jYXRpb24oYnVuZGxlSWQsamFyKTsKLQkJCQkJamFyc1tpXSA9IG5ldyBQbHVnaW5Qcm9jZXNzb3JKYXIoYnVuZGxlSWQsIG5ldyBQYXRoKGphcikpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0JCQl7Ci0JCQkJTGF1bmNoaW5nUGx1Z2luLmxvZyhlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gamFyczsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNEZWJ1Z2dlcigpCi0JewotCQlyZXR1cm4gZGVidWdnZXJJZCAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyB4c2x0VmVyc2lvbikKLQl7Ci0JCXJldHVybiBzdXBwb3J0cy5pbmRleE9mKHhzbHRWZXJzaW9uKSA+PSAwOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3VwcG9ydHMoKQotCXsKLQkJcmV0dXJuIHN1cHBvcnRzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN1cHBvcnRzKFN0cmluZyBzdXBwb3J0cykKLQl7Ci0JCXRoaXMuc3VwcG9ydHMgPSBzdXBwb3J0czsKLQl9Ci0KLQlwdWJsaWMgSURlYnVnZ2VyIGdldERlYnVnZ2VyKCkKLQl7Ci0JCXJldHVybiBYU0xUUnVudGltZS5nZXREZWJ1Z2dlcihkZWJ1Z2dlcklkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWJ1Z2dlcklkKFN0cmluZyBkZWJ1Z2dlcklkKQotCXsKLQkJdGhpcy5kZWJ1Z2dlcklkID0gZGVidWdnZXJJZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9YU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9YU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1MzBmYjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZy5MYXVuY2hpbmdQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5WT0tFUl9ERVNDUklQVE9SID0gTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCArICIuSU5WT0tFUl9ERVNDUklQVE9SIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1BST0NFU1NPUiA9IExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQgKyAiLkFUVFJfUFJPQ0VTU09SIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0xBVU5DSF9UWVBFID0gTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCArICIuQVRUUl9MQVVOQ0hfVFlQRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9CQVNFX1VSSV9UWVBFID0gTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCArICIuQVRUUl9CQVNFX1VSSV9UWVBFIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0JBU0VfVVJJX0RJUkVDVE9SWSA9IExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQgKyAiLkFUVFJfQkFTRV9VUklfRElSRUNUT1JZIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1BST0pFQ1RfTkFNRSA9IExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQgKyAiLkFUVFJfUFJPSkVDVF9OQU1FIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0lOUFVUX0ZJTEUgPSBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lEICsgIi5BVFRSX0lOUFVUX0ZJTEUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfT1VUUFVUX0ZJTEUgPSBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lEICsgIi5BVFRSX09VVFBVVF9GSUxFIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX09VVFBVVF9NRVRIT0QgPSBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lEICsgIi5BVFRSX09VVFBVVF9NRVRIT0QiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfT1VUUFVUX1BST1BFUlRJRVMgPSBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lEICsgIi5BVFRSX09VVFBVVF9QUk9QRVJUSUVTIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1NUWUxFU0hFRVRTX0xJU1QgPSBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lEICsgIi5BVFRSX1NUWUxFU0hFRVRTX0xJU1QiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfUkVOREVSX1RPID0gTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCArICIuQVRUUl9SRU5ERVJfVE8iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0xBVU5DSF9DT05GSUdfVFlQRSA9IExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQgKyAiLmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1BFUkZPUk1fUkVOREVSID0gTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCArICIuQVRUUl9QRVJGT1JNX1JFTkRFUiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9VU0VfREVGQVVMVF9PVVRQVVRfRklMRSA9IExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQgKyAiLkFUVFJfVVNFX0RFRkFVTFRfT1VUUFVUX0ZJTEUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfT1BFTl9GSUxFID0gTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCArICIuQVRUUl9PUEVOX0ZJTEUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfUFJPQ0VTU09SX1dPUktJTkdfRElSID0gTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCArICIuQVRUUl9QUk9DRVNTT1JfV09SS0lOR19ESVIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVVNFX0RFRkFVTFRfUFJPQ0VTU09SX1dPUktJTkdfRElSID0gTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCArICIuQVRUUl9VU0VfREVGQVVMVF9QUk9DRVNTT1JfV09SS0lOR19ESVIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVVNFX0RFRkFVTFRfUFJPQ0VTU09SID0gTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCArICIuQVRUUl9VU0VfREVGQVVMVF9QUk9DRVNTT1IiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVVNFX0ZFQVRVUkVTX0ZST01fUFJFRkVSRU5DRVMgPSBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lEICsgIi5BVFRSX1VTRV9GRUFUVVJFU19GUk9NX1BSRUZFUkVOQ0VTIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1VTRV9QUk9QRVJUSUVTX0ZST01fUFJFRkVSRU5DRVMgPSBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lEICsgIi5BVFRSX1VTRV9QUk9QRVJUSUVTX0ZST01fUFJFRkVSRU5DRVMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfSlJFX0RFRkFVTFRfVFlQRV9UWVBFID0gIi5BVFRSX0pSRV9ERUZBVUxUX1RZUEVfVFlQRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9GRUFUVVJFUyA9IExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQgKyAiLkFUVFJfRkVBVFVSRVMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfUElQRUxJTkUgPSBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lEICsgIi5BVFRSX1BJUEVMSU5FIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0RFRkFVTFRfREVCVUdHSU5HX0lOU1RBTExfSUQgPSBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lEICsgIi5BVFRSX0RFRkFVTFRfREVCVUdHSU5HX0lOU1RBTExfSUQiOzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhBTEFOX1RZUEVfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi5wcm9jZXNzb3JUeXBlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQVhPTkJfVFlQRV9JRCA9ICJvcmcuZWNsaXBzZS53c3QueHNsLnNheG9uLnByb2Nlc3NvclR5cGUiOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvWFNMVFJ1bnRpbWUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL1hTTFRSdW50aW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZDlmNjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvWFNMVFJ1bnRpbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZy5GZWF0dXJlUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmcuTGF1bmNoaW5nUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nLk91dHB1dFByb3BlcnR5UHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmcuUHJvY2Vzc29ySmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nLlByb2Nlc3NvclByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nLnJlZ2lzdHJ5LkRlYnVnZ2VyUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmcucmVnaXN0cnkuSW52b2tlclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nLnJlZ2lzdHJ5LlByb2Nlc3NvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nLnJlZ2lzdHJ5LlByb2Nlc3NvclR5cGVSZWdpc3RyeTsKLQotcHVibGljIGNsYXNzIFhTTFRSdW50aW1lCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9QUk9DRVNTT1JfWE1MID0gIlBSRUZfUFJPQ0VTU09SX1hNTCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9GRUFUVVJFX1hNTCA9ICJQUkVGX0ZFQVRVUkVfWE1MIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX09VVFBVVF9QUk9QRVJUSUVTX1hNTCA9ICJQUkVGX09VVFBVVF9QUk9QRVJUSUVTX1hNTCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlJFX0RFRkFVTFRfUFJPQ0VTU09SX0lEID0gIm9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmpyZS5kZWZhdWx0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKUkVfREVGQVVMVF9QUk9DRVNTT1JfVFlQRV9JRCA9ICJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5wcm9jZXNzb3JUeXBlLmpyZURlZmF1bHQiOwotCi0JcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIE5FWFRfSURfTE9DSyA9IG5ldyBieXRlWzBdOwotCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBSRUdJU1RSWV9MT0NLID0gbmV3IGJ5dGVbMF07Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgbGFzdFN0YW5kaW5JRDsKLQlwcml2YXRlIHN0YXRpYyBQcm9jZXNzb3JUeXBlUmVnaXN0cnkgcHJvY2Vzc29yVHlwZVJlZ2lzdHJ5OwotCXByaXZhdGUgc3RhdGljIFByb2Nlc3NvclJlZ2lzdHJ5IHByb2Nlc3NvclJlZ2lzdHJ5OwotCXByaXZhdGUgc3RhdGljIEludm9rZXJSZWdpc3RyeSBpbnZva2VyUmVnaXN0cnk7Ci0JcHJpdmF0ZSBzdGF0aWMgRGVidWdnZXJSZWdpc3RyeSBkZWJ1Z2dlclJlZ2lzdHJ5OwotCi0JcHJpdmF0ZSBzdGF0aWMgUHJvY2Vzc29yVHlwZVJlZ2lzdHJ5IGdldFByb2Nlc3NvclR5cGVSZWdpc3RyeSgpCi0JewotCQlzeW5jaHJvbml6ZWQgKFJFR0lTVFJZX0xPQ0spCi0JCXsKLQkJCWlmIChwcm9jZXNzb3JUeXBlUmVnaXN0cnkgPT0gbnVsbCkKLQkJCQlwcm9jZXNzb3JUeXBlUmVnaXN0cnkgPSBuZXcgUHJvY2Vzc29yVHlwZVJlZ2lzdHJ5KCk7Ci0JCX0KLQkJcmV0dXJuIHByb2Nlc3NvclR5cGVSZWdpc3RyeTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFByb2Nlc3NvclJlZ2lzdHJ5IGdldFByb2Nlc3NvclJlZ2lzdHJ5KCkKLQl7Ci0JCXN5bmNocm9uaXplZCAoUkVHSVNUUllfTE9DSykKLQkJewotCQkJaWYgKHByb2Nlc3NvclJlZ2lzdHJ5ID09IG51bGwpCi0JCQkJcHJvY2Vzc29yUmVnaXN0cnkgPSBuZXcgUHJvY2Vzc29yUmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gcHJvY2Vzc29yUmVnaXN0cnk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSW52b2tlclJlZ2lzdHJ5IGdldEludm9rZXJSZWdpc3RyeSgpCi0JewotCQlzeW5jaHJvbml6ZWQgKFJFR0lTVFJZX0xPQ0spCi0JCXsKLQkJCWlmIChpbnZva2VyUmVnaXN0cnkgPT0gbnVsbCkKLQkJCQlpbnZva2VyUmVnaXN0cnkgPSBuZXcgSW52b2tlclJlZ2lzdHJ5KCk7Ci0JCX0KLQkJcmV0dXJuIGludm9rZXJSZWdpc3RyeTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBEZWJ1Z2dlclJlZ2lzdHJ5IGdldERlYnVnZ2VyUmVnaXN0cnkoKQotCXsKLQkJc3luY2hyb25pemVkIChSRUdJU1RSWV9MT0NLKQotCQl7Ci0JCQlpZiAoZGVidWdnZXJSZWdpc3RyeSA9PSBudWxsKQotCQkJCWRlYnVnZ2VyUmVnaXN0cnkgPSBuZXcgRGVidWdnZXJSZWdpc3RyeSgpOwotCQl9Ci0JCXJldHVybiBkZWJ1Z2dlclJlZ2lzdHJ5OwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHNhdmVQcmVmZXJlbmNlcygpCi0JewotCQlMYXVuY2hpbmdQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlzeW5jaHJvbml6ZWQgKFJFR0lTVFJZX0xPQ0spCi0JCXsKLQkJCS8vIGZvcmNlIHRoZSByZWdpc3RyaWVzIHRvIGJlIHJlLWluaXRpYWxpc2VkIG5leHQgdGltZSBpdCBpcyByZXF1aXJlZAotCQkJcHJvY2Vzc29yUmVnaXN0cnkgPSBudWxsOwotCQkJcHJvY2Vzc29yVHlwZVJlZ2lzdHJ5ID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEZpbmQgYSB1bmlxdWUgcHJvY2Vzc29yIGluc3RhbGwgaWQuIENoZWNrIGV4aXN0aW5nICdyZWFsJyBwcm9jZXNzb3JzLCBhcwotCSAqIHdlbGwgYXMgdGhlIGxhc3QgaWQgdXNlZCBmb3IgYSBzdGFuZGluLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZVVuaXF1ZVByb2Nlc3NvcklkKElQcm9jZXNzb3JUeXBlIHR5cGUpCi0JewotCQlJUHJvY2Vzc29ySW5zdGFsbFtdIGluc3RhbGxzID0gWFNMVFJ1bnRpbWUuZ2V0UHJvY2Vzc29ycyh0eXBlLmdldElkKCkpOwotCQlTdHJpbmcgaWQgPSBudWxsOwotCQlzeW5jaHJvbml6ZWQgKE5FWFRfSURfTE9DSykKLQkJewotCQkJZG8KLQkJCXsKLQkJCQlpZCA9IFN0cmluZy52YWx1ZU9mKCsrbGFzdFN0YW5kaW5JRCk7Ci0JCQl9Ci0JCQl3aGlsZSAoaXNUYWtlbihpZCwgaW5zdGFsbHMpKTsKLQkJfQotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJUHJvY2Vzc29ySmFyIGNyZWF0ZVByb2Nlc3NvckphcihJUGF0aCBwYXRoKQotCXsKLQkJcmV0dXJuIG5ldyBQcm9jZXNzb3JKYXIocGF0aCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1Rha2VuKFN0cmluZyBpZCwgSVByb2Nlc3Nvckluc3RhbGxbXSBpbnN0YWxscykKLQl7Ci0JCWZvciAoSVByb2Nlc3Nvckluc3RhbGwgaW5zdGFsbCA6IGluc3RhbGxzKQotCQl7Ci0JCQlpZiAoaW5zdGFsbC5nZXRJZCgpLmVxdWFscyhpZCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSURlYnVnZ2VyW10gZ2V0RGVidWdnZXJzKCkKLQl7Ci0JCXJldHVybiBnZXREZWJ1Z2dlclJlZ2lzdHJ5KCkuZ2V0RGVidWdnZXJzKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJRGVidWdnZXIgZ2V0RGVidWdnZXIoU3RyaW5nIGlkKQotCXsKLQkJcmV0dXJuIGdldERlYnVnZ2VyUmVnaXN0cnkoKS5nZXREZWJ1Z2dlcihpZCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJUHJvY2Vzc29ySW5zdGFsbFtdIGdldFByb2Nlc3NvcnMoKQotCXsKLQkJcmV0dXJuIGdldFByb2Nlc3NvclJlZ2lzdHJ5KCkuZ2V0UHJvY2Vzc29ycygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVByb2Nlc3Nvckluc3RhbGxbXSBnZXRQcm9jZXNzb3JzKFN0cmluZyB0eXBlSWQpCi0JewotCQlyZXR1cm4gZ2V0UHJvY2Vzc29yUmVnaXN0cnkoKS5nZXRQcm9jZXNzb3JzKHR5cGVJZCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJUHJvY2Vzc29ySW5zdGFsbCBnZXRQcm9jZXNzb3IoU3RyaW5nIHByb2Nlc3NvcklkKQotCXsKLQkJSVByb2Nlc3Nvckluc3RhbGxbXSBwcm9jZXNzb3JzID0gZ2V0UHJvY2Vzc29ycygpOwotCQlmb3IgKElQcm9jZXNzb3JJbnN0YWxsIGluc3RhbGwgOiBwcm9jZXNzb3JzKQotCQl7Ci0JCQlpZiAoaW5zdGFsbC5nZXRJZCgpLmVxdWFscyhwcm9jZXNzb3JJZCkpCi0JCQkJcmV0dXJuIGluc3RhbGw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJUHJvY2Vzc29ySW5zdGFsbCBnZXREZWZhdWx0UHJvY2Vzc29yKCkKLQl7Ci0JCXJldHVybiBnZXRQcm9jZXNzb3JSZWdpc3RyeSgpLmdldERlZmF1bHRQcm9jZXNzb3IoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElQcm9jZXNzb3JJbnN0YWxsIGdldEpSRURlZmF1bHRQcm9jZXNzb3IoKQotCXsKLQkJcmV0dXJuIGdldFByb2Nlc3NvclJlZ2lzdHJ5KCkuZ2V0SlJFRGVmYXVsdFByb2Nlc3NvcigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVByb2Nlc3NvclR5cGVbXSBnZXRQcm9jZXNzb3JUeXBlcygpCi0JewotCQlyZXR1cm4gZ2V0UHJvY2Vzc29yVHlwZVJlZ2lzdHJ5KCkuZ2V0UHJvY2Vzc29yVHlwZXMoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElQcm9jZXNzb3JUeXBlW10gZ2V0UHJvY2Vzc29yVHlwZXNFeGNsSlJFRGVmYXVsdCgpCi0JewotCQlyZXR1cm4gZ2V0UHJvY2Vzc29yVHlwZVJlZ2lzdHJ5KCkuZ2V0UHJvY2Vzc29yVHlwZXNFeGNsSlJFRGVmYXVsdCgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVByb2Nlc3NvclR5cGUgZ2V0UHJvY2Vzc29yVHlwZShTdHJpbmcgaWQpCi0JewotCQlyZXR1cm4gZ2V0UHJvY2Vzc29yVHlwZVJlZ2lzdHJ5KCkuZ2V0UHJvY2Vzc29yVHlwZShpZCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJUHJvY2Vzc29ySW52b2tlciBnZXRQcm9jZXNzb3JJbnZva2VyKFN0cmluZyBpbnZva2VySWQpCi0JewotCQlyZXR1cm4gZ2V0SW52b2tlclJlZ2lzdHJ5KCkuZ2V0UHJvY2Vzc29ySW52b2tlcihpbnZva2VySWQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVByb2Nlc3Nvckludm9rZXJbXSBnZXRQcm9jZXNzb3JJbnZva2VycygpCi0JewotCQlyZXR1cm4gZ2V0SW52b2tlclJlZ2lzdHJ5KCkuZ2V0UHJvY2Vzc29ySW52b2tlcnMoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcygpCi0JewotCQlyZXR1cm4gTGF1bmNoaW5nUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzYXZlRmVhdHVyZVByZWZlcmVuY2VzKE1hcDxJUHJvY2Vzc29yVHlwZSwgTWFwPFN0cmluZywgU3RyaW5nPj4gdHlwZUZlYXR1cmVzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQlyZXR1cm47Ci0JCXRyeQotCQl7Ci0JCQltb25pdG9yLmJlZ2luVGFzaygiU2F2aW5nIGZlYXR1cmVzLi4uIiwgMTAwKTsKLQkJCUZlYXR1cmVQcmVmZXJlbmNlcyBwcmVmcyA9IG5ldyBGZWF0dXJlUHJlZmVyZW5jZXMoKTsKLQkJCU1hcDxTdHJpbmcsTWFwPFN0cmluZyxTdHJpbmc+PiB0eXBlSWRGZWF0dXJlcyA9IG5ldyBIYXNoTWFwPFN0cmluZyxNYXA8U3RyaW5nLFN0cmluZz4+KHR5cGVGZWF0dXJlcy5zaXplKCkpOwotCQkJZm9yIChJUHJvY2Vzc29yVHlwZSB0eXBlIDogdHlwZUZlYXR1cmVzLmtleVNldCgpKQotCQkJewotCQkJCU1hcDxTdHJpbmcsU3RyaW5nPiB2YWx1ZXMgPSB0eXBlRmVhdHVyZXMuZ2V0KHR5cGUpOwotCQkJCXR5cGVJZEZlYXR1cmVzLnB1dCh0eXBlLmdldElkKCksIHZhbHVlcyk7Ci0JCQl9Ci0JCQlwcmVmcy5zZXRUeXBlRmVhdHVyZXModHlwZUlkRmVhdHVyZXMpOwotCQkJU3RyaW5nIHhtbCA9IHByZWZzLmdldEFzWE1MKCk7Ci0JCQltb25pdG9yLndvcmtlZCg0MCk7Ci0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJcmV0dXJuOwotCQkJWFNMVFJ1bnRpbWUuZ2V0UHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShYU0xUUnVudGltZS5QUkVGX0ZFQVRVUkVfWE1MLCB4bWwpOwotCQkJbW9uaXRvci53b3JrZWQoMzApOwotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCXJldHVybjsKLQkJCVhTTFRSdW50aW1lLnNhdmVQcmVmZXJlbmNlcygpOwotCQkJbW9uaXRvci53b3JrZWQoMzApOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkKLQkJewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQsIkZhaWxlZCB0byBzYXZlIGZlYXR1cmUgcHJlZmVyZW5jZXMiLGUpKTsKLQkJfQotCQlmaW5hbGx5Ci0JCXsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNhdmVPdXRwdXRQcm9wZXJ0eVByZWZlcmVuY2VzKE1hcDxJUHJvY2Vzc29yVHlwZSwgUHJvcGVydGllcz4gdHlwZVByb3BlcnRpZXMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCXJldHVybjsKLQkJdHJ5Ci0JCXsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKCJTYXZpbmcgcHJvcGVydGllcy4uLiIsIDEwMCk7Ci0JCQlPdXRwdXRQcm9wZXJ0eVByZWZlcmVuY2VzIHByZWZzID0gbmV3IE91dHB1dFByb3BlcnR5UHJlZmVyZW5jZXMoKTsKLQkJCWZvciAoSVByb2Nlc3NvclR5cGUgdHlwZSA6IHR5cGVQcm9wZXJ0aWVzLmtleVNldCgpKQotCQkJewotCQkJCXByZWZzLnNldE91dHB1dFByb3BlcnR5VmFsdWVzKHR5cGUuZ2V0SWQoKSwgdHlwZVByb3BlcnRpZXMuZ2V0KHR5cGUpKTsKLQkJCX0KLQkJCVN0cmluZyB4bWwgPSBwcmVmcy5nZXRBc1hNTCgpOwotCQkJbW9uaXRvci53b3JrZWQoNDApOwotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCXJldHVybjsKLQkJCVhTTFRSdW50aW1lLmdldFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoWFNMVFJ1bnRpbWUuUFJFRl9PVVRQVVRfUFJPUEVSVElFU19YTUwsIHhtbCk7Ci0JCQltb25pdG9yLndvcmtlZCgzMCk7Ci0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJcmV0dXJuOwotCQkJWFNMVFJ1bnRpbWUuc2F2ZVByZWZlcmVuY2VzKCk7Ci0JCQltb25pdG9yLndvcmtlZCgzMCk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCwiRmFpbGVkIHRvIHNhdmUgb3V0cHV0IHByb3BlcnR5IHByZWZlcmVuY2VzIixlKSk7Ci0JCX0KLQkJZmluYWxseQotCQl7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzYXZlUHJvY2Vzc29yUHJlZmVyZW5jZXMoSVByb2Nlc3Nvckluc3RhbGxbXSBpbnN0YWxscywgSVByb2Nlc3Nvckluc3RhbGwgZGVmYXVsdEluc3RhbGwsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCXJldHVybjsKLQkJdHJ5Ci0JCXsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKCJTYXZpbmcgcHJvY2Vzc29ycy4uLiIsIDEwMCk7Ci0JCQlQcm9jZXNzb3JQcmVmZXJlbmNlcyBwcmVmcyA9IG5ldyBQcm9jZXNzb3JQcmVmZXJlbmNlcygpOwotCQkJaWYgKGRlZmF1bHRJbnN0YWxsICE9IG51bGwpCi0JCQkJcHJlZnMuc2V0RGVmYXVsdFByb2Nlc3NvcklkKGRlZmF1bHRJbnN0YWxsLmdldElkKCkpOwotCQkJcHJlZnMuc2V0UHJvY2Vzc29ycyhuZXcgQXJyYXlMaXN0PElQcm9jZXNzb3JJbnN0YWxsPihBcnJheXMuYXNMaXN0KGluc3RhbGxzKSkpOwotCQkJU3RyaW5nIHhtbCA9IHByZWZzLmdldEFzWE1MKCk7Ci0JCQltb25pdG9yLndvcmtlZCg0MCk7Ci0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJcmV0dXJuOwotCQkJWFNMVFJ1bnRpbWUuZ2V0UHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShYU0xUUnVudGltZS5QUkVGX1BST0NFU1NPUl9YTUwsIHhtbCk7Ci0JCQltb25pdG9yLndvcmtlZCgzMCk7Ci0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJcmV0dXJuOwotCQkJWFNMVFJ1bnRpbWUuc2F2ZVByZWZlcmVuY2VzKCk7Ci0JCQltb25pdG9yLndvcmtlZCgzMCk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCwiRmFpbGVkIHRvIHNhdmUgcHJvY2VzcyBwcmVmZXJlbmNlcyIsZSkpOwotCQl9Ci0JCWZpbmFsbHkKLQkJewotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFByb3BlcnRpZXMgY3JlYXRlRGVmYXVsdE91dHB1dFByb3BlcnRpZXMoU3RyaW5nIHR5cGVJZCkKLQl7Ci0JCVByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotCQlpZiAoSlJFX0RFRkFVTFRfUFJPQ0VTU09SX1RZUEVfSUQuZXF1YWxzKHR5cGVJZCkpCi0JCQlwcm9wcy5wdXQoImluZGVudCIsICJ5ZXMiKTsKLQkJZWxzZSBpZiAoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5YQUxBTl9UWVBFX0lELmVxdWFscyh0eXBlSWQpKQotCQkJcHJvcHMucHV0KCJ7aHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHR9aW5kZW50LWFtb3VudCIsICI0Iik7Ci0JCWVsc2UgaWYgKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuU0FYT05CX1RZUEVfSUQuZXF1YWxzKHR5cGVJZCkpCi0JCQlwcm9wcy5wdXQoIntodHRwOi8vc2F4b24uc2YubmV0L31pbmRlbnQtc3BhY2VzIiwgIjQiKTsKLQkJcmV0dXJuIHByb3BzOwotCX0KLQkKLQkvKgotCSAqIFRPRE8gbW92ZSB0byBYU0xDb3JlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzWE1MRmlsZShJRmlsZSBmaWxlKQotCXsKLQkJSUNvbnRlbnRUeXBlTWFuYWdlciBjb250ZW50VHlwZU1hbmFnZXIgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKTsKLQkJSUNvbnRlbnRUeXBlW10gdHlwZXMgPSBjb250ZW50VHlwZU1hbmFnZXIuZmluZENvbnRlbnRUeXBlc0ZvcihmaWxlLmdldE5hbWUoKSk7Ci0JCWZvciAoSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlIDogdHlwZXMpCi0JCXsKLQkJCWlmIChjb250ZW50VHlwZS5pc0tpbmRPZihjb250ZW50VHlwZU1hbmFnZXIuZ2V0Q29udGVudFR5cGUoIm9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiKSkgfHwgY29udGVudFR5cGUuaXNLaW5kT2YoY29udGVudFR5cGVNYW5hZ2VyLmdldENvbnRlbnRUeXBlKCJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueG1sc291cmNlIikpKQotCQkJewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoKLQkgKiBUT0RPIG1vdmUgdG8gWFNMQ29yZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1hTTEZpbGUoSUZpbGUgZmlsZSkKLQl7Ci0JCUlDb250ZW50VHlwZU1hbmFnZXIgY29udGVudFR5cGVNYW5hZ2VyID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCk7Ci0JCUlDb250ZW50VHlwZVtdIHR5cGVzID0gY29udGVudFR5cGVNYW5hZ2VyLmZpbmRDb250ZW50VHlwZXNGb3IoZmlsZS5nZXROYW1lKCkpOwotCQlmb3IgKElDb250ZW50VHlwZSBjb250ZW50VHlwZSA6IHR5cGVzKQotCQl7Ci0JCQlpZiAoY29udGVudFR5cGUuaXNLaW5kT2YoY29udGVudFR5cGVNYW5hZ2VyLmdldENvbnRlbnRUeXBlKCJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueHNsc291cmNlIikpKQotCQkJewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9jb25maWcvTGF1bmNoQXR0cmlidXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9jb25maWcvTGF1bmNoQXR0cmlidXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ODc4ZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvY29uZmlnL0xhdW5jaEF0dHJpYnV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuY29uZmlnOwotCi1wdWJsaWMgY2xhc3MgTGF1bmNoQXR0cmlidXRlCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9TVUZGSVggPSAiLlRZUEUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX1NVRkZJWCA9ICIuVkFMVUUiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9TVFJJTkcgPSAic3RyaW5nIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0JPT0xFQU4gPSAiYm9vbGVhbiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9JTlQgPSAiaW50IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0RPVUJMRSA9ICJkb3VibGUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRkxPQVQgPSAiZmxvYXQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfQ0xBU1MgPSAiY2xhc3MiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfT0JKRUNUID0gIm9iamVjdCI7Ci0KLQlwdWJsaWMgZmluYWwgU3RyaW5nIHVyaTsKLQlwdWJsaWMgU3RyaW5nIHR5cGU7Ci0JcHVibGljIFN0cmluZyB2YWx1ZTsKLQotCXB1YmxpYyBMYXVuY2hBdHRyaWJ1dGUoU3RyaW5nIHVyaSwgU3RyaW5nIHR5cGUsIFN0cmluZyB2YWx1ZSkKLQl7Ci0JCXRoaXMudXJpID0gdXJpOwotCQl0aGlzLnR5cGUgPSB0eXBlOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKQotCXsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCXsKLQkJcmV0dXJuIHVyaS5oYXNoQ29kZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKQotCXsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIExhdW5jaEF0dHJpYnV0ZSkKLQkJewotCQkJTGF1bmNoQXR0cmlidXRlIGF0dCA9IChMYXVuY2hBdHRyaWJ1dGUpIG9iajsKLQkJCXJldHVybiBhdHQudXJpLmVxdWFscyh1cmkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvY29uZmlnL0xhdW5jaEZlYXR1cmVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9jb25maWcvTGF1bmNoRmVhdHVyZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEzNzg5Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9jb25maWcvTGF1bmNoRmVhdHVyZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5jb25maWc7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZy5QcmVmZXJlbmNlVXRpbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1wdWJsaWMgY2xhc3MgTGF1bmNoRmVhdHVyZXMKLXsKLQlwcml2YXRlIGZpbmFsIFNldDxMYXVuY2hBdHRyaWJ1dGU+IGZlYXR1cmVzID0gbmV3IEhhc2hTZXQ8TGF1bmNoQXR0cmlidXRlPigpOwotCi0JcHVibGljIFNldDxMYXVuY2hBdHRyaWJ1dGU+IGdldEZlYXR1cmVzKCkKLQl7Ci0JCXJldHVybiBmZWF0dXJlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRGZWF0dXJlKExhdW5jaEF0dHJpYnV0ZSBmZWF0dXJlKQotCXsKLQkJZmVhdHVyZXMuYWRkKGZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBMYXVuY2hBdHRyaWJ1dGUgZ2V0RmVhdHVyZShTdHJpbmcgdXJpKQotCXsKLQkJZm9yIChJdGVyYXRvcjxMYXVuY2hBdHRyaWJ1dGU+IGl0ZXIgPSBmZWF0dXJlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0JCXsKLQkJCUxhdW5jaEF0dHJpYnV0ZSB0diA9IChMYXVuY2hBdHRyaWJ1dGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKHR2LnVyaS5lcXVhbHModXJpKSkKLQkJCQlyZXR1cm4gdHY7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRmVhdHVyZShTdHJpbmcgdXJpKQotCXsKLQkJZm9yIChJdGVyYXRvcjxMYXVuY2hBdHRyaWJ1dGU+IGl0ZXIgPSBmZWF0dXJlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0JCXsKLQkJCUxhdW5jaEF0dHJpYnV0ZSBmZWF0dXJlID0gKExhdW5jaEF0dHJpYnV0ZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZmVhdHVyZS51cmkuZXF1YWxzKHVyaSkpCi0JCQkJaXRlci5yZW1vdmUoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9YTUwoKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFRyYW5zZm9ybWVyRXhjZXB0aW9uCi0JewotCQlEb2N1bWVudCBkb2MgPSBQcmVmZXJlbmNlVXRpbC5nZXREb2N1bWVudCgpOwotCi0JCUVsZW1lbnQgZmVhdHVyZXNFbCA9IGRvYy5jcmVhdGVFbGVtZW50KCJGZWF0dXJlcyIpOwotCQlkb2MuYXBwZW5kQ2hpbGQoZmVhdHVyZXNFbCk7Ci0KLQkJZm9yIChJdGVyYXRvcjxMYXVuY2hBdHRyaWJ1dGU+IGl0ZXIgPSBmZWF0dXJlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0JCXsKLQkJCUxhdW5jaEF0dHJpYnV0ZSBmZWF0dXJlID0gKExhdW5jaEF0dHJpYnV0ZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZmVhdHVyZS52YWx1ZSA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJRWxlbWVudCBmZWF0dXJlRWwgPSBkb2MuY3JlYXRlRWxlbWVudCgiRmVhdHVyZSIpOwotCQkJZmVhdHVyZUVsLnNldEF0dHJpYnV0ZSgibmFtZSIsIGZlYXR1cmUudXJpKTsKLQkJCWZlYXR1cmVFbC5zZXRBdHRyaWJ1dGUoInR5cGUiLCBmZWF0dXJlLnR5cGUpOwotCQkJZmVhdHVyZUVsLnNldEF0dHJpYnV0ZSgidmFsdWUiLCBmZWF0dXJlLnZhbHVlKTsKLQkJCWZlYXR1cmVzRWwuYXBwZW5kQ2hpbGQoZmVhdHVyZUVsKTsKLQkJfQotCi0JCXJldHVybiBQcmVmZXJlbmNlVXRpbC5zZXJpYWxpemVEb2N1bWVudChkb2MpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGF1bmNoRmVhdHVyZXMgZnJvbVhNTChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCURvY3VtZW50IGRvYyA9IFByZWZlcmVuY2VVdGlsLmdldERvY3VtZW50KGlucHV0U3RyZWFtKTsKLQotCQlMYXVuY2hGZWF0dXJlcyBwZGVmID0gbmV3IExhdW5jaEZlYXR1cmVzKCk7Ci0KLQkJRWxlbWVudCBmZWF0dXJlc0VsID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpOwotCi0JCU5vZGVMaXN0IGZlYXR1cmVFbHMgPSBmZWF0dXJlc0VsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJGZWF0dXJlIik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZUVscy5nZXRMZW5ndGgoKTsgaSsrKQotCQl7Ci0JCQlFbGVtZW50IGZlYXR1cmVFbCA9IChFbGVtZW50KSBmZWF0dXJlRWxzLml0ZW0oaSk7Ci0JCQlTdHJpbmcgbmFtZSA9IGZlYXR1cmVFbC5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKLQkJCVN0cmluZyB0eXBlID0gZmVhdHVyZUVsLmdldEF0dHJpYnV0ZSgidHlwZSIpOwotCQkJU3RyaW5nIHZhbHVlID0gZmVhdHVyZUVsLmdldEF0dHJpYnV0ZSgidmFsdWUiKTsKLQkJCXBkZWYuYWRkRmVhdHVyZShuZXcgTGF1bmNoQXR0cmlidXRlKG5hbWUsIHR5cGUsIHZhbHVlKSk7Ci0JCX0KLQotCQlyZXR1cm4gcGRlZjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9jb25maWcvTGF1bmNoSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9jb25maWcvTGF1bmNoSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NTVjZDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvY29uZmlnL0xhdW5jaEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmNvbmZpZzsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlNlcnZlclNvY2tldDsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnZhcmlhYmxlcy5WYXJpYWJsZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZy5MYXVuY2hpbmdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmcuUHJlZmVyZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnZva2VyLmNvbmZpZy5QaXBlbGluZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnZva2VyLmNvbmZpZy5UcmFuc2Zvcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW52b2tlci5jb25maWcuVHlwZWRWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5JRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5JT3V0cHV0UHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuSVByb2Nlc3Nvckluc3RhbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuSVByb2Nlc3NvclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5YU0xUUnVudGltZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotcHVibGljIGNsYXNzIExhdW5jaEhlbHBlcgotewotCXByaXZhdGUgSVBhdGggc291cmNlRmlsZTsKLQlwcml2YXRlIGZpbmFsIFVSTCBzb3VyY2U7Ci0JcHJpdmF0ZSBmaW5hbCBGaWxlIHRhcmdldDsKLQlwcml2YXRlIGZpbmFsIExhdW5jaEZlYXR1cmVzIGZlYXR1cmVzOwotCXByaXZhdGUgZmluYWwgTGF1bmNoUGlwZWxpbmUgcGlwZWxpbmU7Ci0JcHJpdmF0ZSBmaW5hbCBMYXVuY2hQcm9wZXJ0aWVzIG91dHB1dFByb3BlcnRpZXM7Ci0JcHJpdmF0ZSBpbnQgcmVxdWVzdFBvcnQgPSAtMTsKLQlwcml2YXRlIGludCBldmVudFBvcnQgPSAtMTsKLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gb3BlbkZpbGVPbkNvbXBsZXRpb247Ci0KLQlwdWJsaWMgTGF1bmNoSGVscGVyKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlzb3VyY2UgPSBoeWRyYXRlU291cmNlRmlsZVVSTChjb25maWd1cmF0aW9uKTsKLQkJdGFyZ2V0ID0gaHlkcmF0ZU91dHB1dEZpbGUoY29uZmlndXJhdGlvbik7Ci0JCWZlYXR1cmVzID0gaHlkcmF0ZUZlYXR1cmVzKGNvbmZpZ3VyYXRpb24pOwotCQlvdXRwdXRQcm9wZXJ0aWVzID0gaHlkcmF0ZU91dHB1dFByb3BlcnRpZXMoY29uZmlndXJhdGlvbik7Ci0JCXBpcGVsaW5lID0gaHlkcmF0ZVBpcGVsaW5lKGNvbmZpZ3VyYXRpb24pOwotCQlvcGVuRmlsZU9uQ29tcGxldGlvbiA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9PUEVOX0ZJTEUsIHRydWUpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0UmVxdWVzdFBvcnQoKQotCXsKLQkJaWYgKHJlcXVlc3RQb3J0ID09IC0xKQotCQkJcmVxdWVzdFBvcnQgPSBmaW5kRnJlZVBvcnQoKTsKLQkJcmV0dXJuIHJlcXVlc3RQb3J0OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RXZlbnRQb3J0KCkKLQl7Ci0JCWlmIChldmVudFBvcnQgPT0gLTEpCi0JCQlldmVudFBvcnQgPSBmaW5kRnJlZVBvcnQoKTsKLQkJcmV0dXJuIGV2ZW50UG9ydDsKLQl9Ci0KLQlwdWJsaWMgTGF1bmNoUHJvcGVydGllcyBnZXRQcm9wZXJ0aWVzKCkKLQl7Ci0JCXJldHVybiBvdXRwdXRQcm9wZXJ0aWVzOwotCX0KLQotCXB1YmxpYyBMYXVuY2hGZWF0dXJlcyBnZXRGZWF0dXJlcygpCi0JewotCQlyZXR1cm4gZmVhdHVyZXM7Ci0JfQotCi0JcHVibGljIExhdW5jaFBpcGVsaW5lIGdldFBpcGVsaW5lKCkKLQl7Ci0JCXJldHVybiBwaXBlbGluZTsKLQl9Ci0KLQlwdWJsaWMgVVJMIGdldFNvdXJjZSgpCi0JewotCQlyZXR1cm4gc291cmNlOwotCX0KLQotCXB1YmxpYyBGaWxlIGdldFRhcmdldCgpCi0JewotCQlyZXR1cm4gdGFyZ2V0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmUoRmlsZSBmaWxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJQnVmZmVyZWRXcml0ZXIgd3JpdGVyID0gbnVsbDsKLQkJdHJ5Ci0JCXsKLQkJCS8vIGVuc3VyZSBpdCBleGlzdHMKLQkJCWZpbGUuY3JlYXRlTmV3RmlsZSgpOwotCQkJd3JpdGVyID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBGaWxlV3JpdGVyKGZpbGUpKTsKLQkJCVBpcGVsaW5lRGVmaW5pdGlvbiBwZGVmID0gbmV3IFBpcGVsaW5lRGVmaW5pdGlvbigpOwotCQkJZm9yIChJdGVyYXRvcjw/PiBpdGVyID0gZmVhdHVyZXMuZ2V0RmVhdHVyZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0JCQl7Ci0JCQkJTGF1bmNoQXR0cmlidXRlIGF0dCA9IChMYXVuY2hBdHRyaWJ1dGUpIGl0ZXIubmV4dCgpOwotCQkJCXBkZWYuYWRkRmVhdHVyZShuZXcgVHlwZWRWYWx1ZShhdHQudXJpLCBhdHQudHlwZSwgYXR0LnZhbHVlKSk7Ci0JCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ZXIgPSBwaXBlbGluZS5nZXRUcmFuc2Zvcm1EZWZzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotCQkJewotCQkJCUxhdW5jaFRyYW5zZm9ybSBsdCA9IChMYXVuY2hUcmFuc2Zvcm0pIGl0ZXIubmV4dCgpOwotCQkJCVRyYW5zZm9ybURlZmluaXRpb24gdGRlZiA9IG5ldyBUcmFuc2Zvcm1EZWZpbml0aW9uKCk7Ci0JCQkJVVJMIHVybCA9IHBhdGhUb1VSTChsdC5nZXRMb2NhdGlvbigpKTsKLQkJCQl0ZGVmLnNldFN0eWxlc2hlZXRVUkwodXJsLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQkJCXRkZWYuc2V0UmVzb2x2ZXJDbGFzcyhsdC5nZXRSZXNvbHZlcigpKTsKLQkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ZXJhdG9yID0gbHQuZ2V0UGFyYW1ldGVycygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0JCQkJewotCQkJCQlMYXVuY2hBdHRyaWJ1dGUgYXR0ID0gKExhdW5jaEF0dHJpYnV0ZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQl0ZGVmLmFkZFBhcmFtZXRlcihuZXcgVHlwZWRWYWx1ZShhdHQudXJpLCBhdHQudHlwZSwgYXR0LnZhbHVlKSk7Ci0JCQkJfQotCQkJCS8vIHNldCB0aGUgb3V0cHV0IHByb3BzIGZvciB0aGUgTEFTVCB0cmFuc2Zvcm0gb25seQotCQkJCWlmICghaXRlci5oYXNOZXh0KCkpCi0JCQkJewotCQkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ZXJhdG9yID0gb3V0cHV0UHJvcGVydGllcy5nZXRQcm9wZXJ0aWVzKCkuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotCQkJCQl7Ci0JCQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOwotCQkJCQkJU3RyaW5nIHZhbHVlID0gKFN0cmluZykgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQkJCWlmIChuYW1lICE9IG51bGwgJiYgdmFsdWUgIT0gbnVsbCkKLQkJCQkJCQl0ZGVmLnNldE91dHB1dFByb3BlcnR5KG5hbWUsIHZhbHVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlwZGVmLmFkZFRyYW5zZm9ybURlZih0ZGVmKTsKLQkJCX0KLQotCQkJRG9jdW1lbnQgZG9jID0gcGRlZi50b1hNTCgpOwotCQkJU3RyaW5nIHMgPSBQcmVmZXJlbmNlVXRpbC5zZXJpYWxpemVEb2N1bWVudChkb2MpOwotCQkJd3JpdGVyLndyaXRlKHMpOwotCQl9Ci0JCWNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkKLQkJewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lELCBJU3RhdHVzLkVSUk9SLCAiRmlsZSBub3QgZm91bmQiLCBlKSk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0JCXsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCwgSVN0YXR1cy5FUlJPUiwgIklPIEV4Y2VwdGlvbiIsIGUpKTsKLQkJfQotCQljYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKQotCQl7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQsIElTdGF0dXMuRVJST1IsICJQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIiwgZSkpOwotCQl9Ci0JCWNhdGNoIChUcmFuc2Zvcm1lckV4Y2VwdGlvbiBlKQotCQl7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQsIElTdGF0dXMuRVJST1IsICJUcmFuc2Zvcm1lckV4Y2VwdGlvbiIsIGUpKTsKLQkJfQotCQlmaW5hbGx5Ci0JCXsKLQkJCWlmICh3cml0ZXIgIT0gbnVsbCkKLQkJCXsKLQkJCQl0cnkKLQkJCQl7Ci0JCQkJCXdyaXRlci5jbG9zZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkKLQkJCQl7Ci0JCQkJCUxhdW5jaGluZ1BsdWdpbi5sb2coZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBMYXVuY2hQcm9wZXJ0aWVzIGh5ZHJhdGVPdXRwdXRQcm9wZXJ0aWVzKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlMYXVuY2hQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBudWxsOwotCQlib29sZWFuIHVzZVByZWZlcmVuY2VQcm9wZXJ0aWVzID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1VTRV9QUk9QRVJUSUVTX0ZST01fUFJFRkVSRU5DRVMsIHRydWUpOwotCQlJUHJvY2Vzc29yVHlwZSBkZWZhdWx0VHlwZSA9IFhTTFRSdW50aW1lLmdldEpSRURlZmF1bHRQcm9jZXNzb3IoKS5nZXRQcm9jZXNzb3JUeXBlKCk7Ci0JCUlQcm9jZXNzb3JUeXBlIHB0ID0gZ2V0UHJvY2Vzc29ySW5zdGFsbChjb25maWd1cmF0aW9uKS5nZXRQcm9jZXNzb3JUeXBlKCk7Ci0JCWlmICh1c2VQcmVmZXJlbmNlUHJvcGVydGllcykKLQkJewotCQkJcHJvcGVydGllcyA9IG5ldyBMYXVuY2hQcm9wZXJ0aWVzKCk7Ci0JCQkvLyBnZXQgdGhlIHN0YW5kYXJkIHByb3BlcnRpZXMKLQkJCWZvciAoT2JqZWN0IGVsZW1lbnQgOiBkZWZhdWx0VHlwZS5nZXRPdXRwdXRQcm9wZXJ0eVZhbHVlcygpLmVudHJ5U2V0KCkpCi0JCQl7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgZWxlbWVudDsKLQkJCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOwotCQkJCVN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJcHJvcGVydGllcy5zZXRQcm9wZXJ0eShuYW1lLCB2YWx1ZSk7Ci0JCQl9Ci0JCQkvLyBnZXQgdGhlIHByb2Nlc3Nvci1zcGVjaWZpYyBwcm9wZXJ0aWVzCi0JCQlpZiAoIXB0LmVxdWFscyhkZWZhdWx0VHlwZSkpCi0JCQl7Ci0JCQkJZm9yIChPYmplY3QgZWxlbWVudCA6IHB0LmdldE91dHB1dFByb3BlcnR5VmFsdWVzKCkuZW50cnlTZXQoKSkKLQkJCQl7Ci0JCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGVsZW1lbnQ7Ci0JCQkJCVN0cmluZyBuYW1lID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7Ci0JCQkJCVN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJCXByb3BlcnRpZXMuc2V0UHJvcGVydHkobmFtZSwgdmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCVN0cmluZyBzID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX09VVFBVVF9QUk9QRVJUSUVTLCAoU3RyaW5nKSBudWxsKTsKLQkJCWlmIChzICE9IG51bGwgJiYgcy5sZW5ndGgoKSA+IDApCi0JCQl7Ci0JCQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocy5nZXRCeXRlcygpKTsKLQkJCQlwcm9wZXJ0aWVzID0gTGF1bmNoUHJvcGVydGllcy5mcm9tWE1MKGlucHV0U3RyZWFtKTsKLQkJCQkvLyBlbnN1cmUgYWxsIHByb3BlcnRpZXMgcGVydGFpbiB0byB0aGUgY3VycmVudCBwcm9jZXNzb3IgdHlwZQotCQkJCUlPdXRwdXRQcm9wZXJ0eVtdIGRlZmF1bHRQcm9wcyA9IGRlZmF1bHRUeXBlLmdldE91dHB1dFByb3BlcnRpZXMoKTsKLQkJCQlJT3V0cHV0UHJvcGVydHlbXSBzcGVjaWZpY1Byb3BzID0gcHQuZ2V0T3V0cHV0UHJvcGVydGllcygpOwotCQkJCUlPdXRwdXRQcm9wZXJ0eVtdIHByb3BzID0gbmV3IElPdXRwdXRQcm9wZXJ0eVtzcGVjaWZpY1Byb3BzLmxlbmd0aCArIGRlZmF1bHRQcm9wcy5sZW5ndGhdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkoc3BlY2lmaWNQcm9wcywgMCwgcHJvcHMsIDAsIHNwZWNpZmljUHJvcHMubGVuZ3RoKTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGRlZmF1bHRQcm9wcywgMCwgcHJvcHMsIHNwZWNpZmljUHJvcHMubGVuZ3RoLCBkZWZhdWx0UHJvcHMubGVuZ3RoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ZXJhdG9yID0gcHJvcGVydGllcy5nZXRQcm9wZXJ0aWVzKCkua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLQkJCQl7Ci0JCQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCQkJZm9yIChJT3V0cHV0UHJvcGVydHkgb3V0cHV0UHJvcGVydHkgOiBwcm9wcykKLQkJCQkJewotCQkJCQkJaWYgKG91dHB1dFByb3BlcnR5LmdldFVSSSgpLmVxdWFscyhrZXkpKQotCQkJCQkJewotCQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoIWZvdW5kKQotCQkJCQkJcHJvcGVydGllcy5yZW1vdmVQcm9wZXJ0eShrZXkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJvcGVydGllczsKLQl9Ci0KLQlwcml2YXRlIExhdW5jaEZlYXR1cmVzIGh5ZHJhdGVGZWF0dXJlcyhJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJTGF1bmNoRmVhdHVyZXMgZmVhdHVyZXMgPSBudWxsOwotCQlib29sZWFuIHVzZURlZmF1bHRGZWF0dXJlcyA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9VU0VfRkVBVFVSRVNfRlJPTV9QUkVGRVJFTkNFUywgdHJ1ZSk7Ci0JCWlmICh1c2VEZWZhdWx0RmVhdHVyZXMpCi0JCXsKLQkJCWZlYXR1cmVzID0gbmV3IExhdW5jaEZlYXR1cmVzKCk7Ci0JCQlJUHJvY2Vzc29yVHlwZSBwdCA9IGdldFByb2Nlc3Nvckluc3RhbGwoY29uZmlndXJhdGlvbikuZ2V0UHJvY2Vzc29yVHlwZSgpOwotCQkJTWFwPD8sID8+IGZ2YWxzID0gcHQuZ2V0RmVhdHVyZVZhbHVlcygpOwotCQkJZm9yIChJdGVyYXRvcjw/PiBpdGVyID0gZnZhbHMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0JCQl7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJU3RyaW5nIHVyaSA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOwotCQkJCUlGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlKHB0LmdldEZlYXR1cmVzKCksIHVyaSk7Ci0JCQkJZmVhdHVyZXMuYWRkRmVhdHVyZShuZXcgTGF1bmNoQXR0cmlidXRlKHVyaSwgZmVhdHVyZS5nZXRUeXBlKCksIChTdHJpbmcpIGVudHJ5LmdldFZhbHVlKCkpKTsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCVN0cmluZyBzID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0ZFQVRVUkVTLCAoU3RyaW5nKSBudWxsKTsKLQkJCWlmIChzICE9IG51bGwgJiYgcy5sZW5ndGgoKSA+IDApCi0JCQl7Ci0JCQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocy5nZXRCeXRlcygpKTsKLQkJCQlmZWF0dXJlcyA9IExhdW5jaEZlYXR1cmVzLmZyb21YTUwoaW5wdXRTdHJlYW0pOwotCQkJfQotCQl9Ci0JCXJldHVybiBmZWF0dXJlczsKLQl9Ci0KLQlwcml2YXRlIElGZWF0dXJlIGdldEZlYXR1cmUoSUZlYXR1cmVbXSBmZWF0dXJlcywgU3RyaW5nIHVyaSkKLQl7Ci0JCWZvciAoSUZlYXR1cmUgZmVhdHVyZSA6IGZlYXR1cmVzKQotCQl7Ci0JCQlpZiAoZmVhdHVyZS5nZXRVUkkoKS5lcXVhbHModXJpKSkKLQkJCQlyZXR1cm4gZmVhdHVyZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIExhdW5jaFBpcGVsaW5lIGh5ZHJhdGVQaXBlbGluZShJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJTGF1bmNoUGlwZWxpbmUgcGlwZWxpbmUgPSBudWxsOwotCQlTdHJpbmcgcyA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QSVBFTElORSwgKFN0cmluZykgbnVsbCk7Ci0JCWlmIChzICE9IG51bGwgJiYgcy5sZW5ndGgoKSA+IDApCi0JCXsKLQkJCUJ5dGVBcnJheUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHMuZ2V0Qnl0ZXMoKSk7Ci0JCQlwaXBlbGluZSA9IExhdW5jaFBpcGVsaW5lLmZyb21YTUwoaW5wdXRTdHJlYW0pOwotCQl9Ci0JCXJldHVybiBwaXBlbGluZTsKLQl9Ci0KLQlwcml2YXRlIFVSTCBoeWRyYXRlU291cmNlRmlsZVVSTChJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJU3RyaW5nIHNvdXJjZUZpbGVFeHByID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0lOUFVUX0ZJTEUsIChTdHJpbmcpIG51bGwpOwotCQlzb3VyY2VGaWxlID0gZ2V0U3Vic3RpdHV0ZWRQYXRoKHNvdXJjZUZpbGVFeHByKTsKLQkJVVJMIHVybCA9IHBhdGhUb1VSTChzb3VyY2VGaWxlKTsKLQkJcmV0dXJuIHVybDsKLQl9Ci0KLQlwcml2YXRlIFVSTCBwYXRoVG9VUkwoSVBhdGggc291cmNlRmlsZSkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCVVSTCB1cmwgPSBudWxsOwotCQl0cnkKLQkJewotCQkJdXJsID0gc291cmNlRmlsZS50b0ZpbGUoKS50b1VSTCgpOwotCQl9Ci0JCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLQkJewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lELCBJU3RhdHVzLkVSUk9SLCBzb3VyY2VGaWxlLnRvU3RyaW5nKCksIGUpKTsKLQkJfQotCQlyZXR1cm4gdXJsOwotCX0KLQotCXByaXZhdGUgRmlsZSBoeWRyYXRlT3V0cHV0RmlsZShJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJSVBhdGggb3V0cHV0RmlsZSA9IG51bGw7Ci0JCWJvb2xlYW4gdXNlRGVmYXVsdE91dHB1dEZpbGUgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfVVNFX0RFRkFVTFRfT1VUUFVUX0ZJTEUsIHRydWUpOwotCQlpZiAoIXVzZURlZmF1bHRPdXRwdXRGaWxlKQotCQl7Ci0JCQlTdHJpbmcgb3V0cHV0RmlsZUV4cHIgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfT1VUUFVUX0ZJTEUsIChTdHJpbmcpIG51bGwpOwotCQkJb3V0cHV0RmlsZSA9IGdldFN1YnN0aXR1dGVkUGF0aChvdXRwdXRGaWxlRXhwcik7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkvLyBUT0RPOiB3aGVyZSBpcyB0aGUgZGVmYXVsdCBvdXRwdXQgZmlsZT8gQW5kIG11c3Qgc2hhcmUgdGhpcyB3aXRoCi0JCQkvLyB0aGUgdmFsdWUgZGlzcGxheWVkIGluIHRoZSBVSS4KLQkJCW91dHB1dEZpbGUgPSAoSVBhdGgpIHNvdXJjZUZpbGUuY2xvbmUoKTsKLQkJCW91dHB1dEZpbGUgPSBvdXRwdXRGaWxlLmFkZEZpbGVFeHRlbnNpb24oIm91dCIpLmFkZEZpbGVFeHRlbnNpb24oInhtbCIpOwotCQl9Ci0JCXJldHVybiBvdXRwdXRGaWxlLnRvRmlsZSgpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIElQYXRoIGdldFN1YnN0aXR1dGVkUGF0aChTdHJpbmcgcGF0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCWlmIChwYXRoICE9IG51bGwpCi0JCXsKLQkJCXBhdGggPSBWYXJpYWJsZXNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0cmluZ1ZhcmlhYmxlTWFuYWdlcigpLnBlcmZvcm1TdHJpbmdTdWJzdGl0dXRpb24ocGF0aCk7Ci0JCQlyZXR1cm4gbmV3IFBhdGgocGF0aCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBJUHJvY2Vzc29ySW5zdGFsbCBnZXRQcm9jZXNzb3JJbnN0YWxsKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlib29sZWFuIHVzZURlZmF1bHRQcm9jZXNzb3IgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfVVNFX0RFRkFVTFRfUFJPQ0VTU09SLCB0cnVlKTsKLQkJaWYgKHVzZURlZmF1bHRQcm9jZXNzb3IpCi0JCQlyZXR1cm4gWFNMVFJ1bnRpbWUuZ2V0RGVmYXVsdFByb2Nlc3NvcigpOwotCQlTdHJpbmcgcHJvY2Vzc29ySWQgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfUFJPQ0VTU09SLCAiIik7Ci0JCUlQcm9jZXNzb3JJbnN0YWxsIHByb2Nlc3NvciA9IFhTTFRSdW50aW1lLmdldFByb2Nlc3Nvcihwcm9jZXNzb3JJZCk7Ci0JCXJldHVybiBwcm9jZXNzb3I7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGZyZWUgcG9ydCBudW1iZXIgb24gbG9jYWxob3N0LCBvciAtMSBpZiB1bmFibGUgdG8gZmluZCBhIGZyZWUKLQkgKiBwb3J0LgotCSAqIAotCSAqIEByZXR1cm4gYSBmcmVlIHBvcnQgbnVtYmVyIG9uIGxvY2FsaG9zdCwgb3IgLTEgaWYgdW5hYmxlIHRvIGZpbmQgYSBmcmVlCi0JICogICAgICAgICBwb3J0Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZmluZEZyZWVQb3J0KCkKLQl7Ci0JCVNlcnZlclNvY2tldCBzb2NrZXQgPSBudWxsOwotCQl0cnkKLQkJewotCQkJc29ja2V0ID0gbmV3IFNlcnZlclNvY2tldCgwKTsKLQkJCXJldHVybiBzb2NrZXQuZ2V0TG9jYWxQb3J0KCk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0JCXsKLQkJCUxhdW5jaGluZ1BsdWdpbi5sb2coZSk7Ci0JCX0KLQkJZmluYWxseQotCQl7Ci0JCQlpZiAoc29ja2V0ICE9IG51bGwpCi0JCQl7Ci0JCQkJdHJ5Ci0JCQkJewotCQkJCQlzb2NrZXQuY2xvc2UoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0JCQkJewotCQkJCQlMYXVuY2hpbmdQbHVnaW4ubG9nKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0T3BlbkZpbGVPbkNvbXBsZXRpb24oKQotCXsKLQkJcmV0dXJuIG9wZW5GaWxlT25Db21wbGV0aW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL2NvbmZpZy9MYXVuY2hQaXBlbGluZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvY29uZmlnL0xhdW5jaFBpcGVsaW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZGU0MzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvY29uZmlnL0xhdW5jaFBpcGVsaW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuY29uZmlnOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nLkxhdW5jaGluZ1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZy5QcmVmZXJlbmNlVXRpbDsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotcHVibGljIGNsYXNzIExhdW5jaFBpcGVsaW5lCi17Ci0JcHJpdmF0ZSBMaXN0PExhdW5jaFRyYW5zZm9ybT4gdHJhbnNmb3JtRGVmcyA9IG5ldyBBcnJheUxpc3Q8TGF1bmNoVHJhbnNmb3JtPigpOwotCXByaXZhdGUgZmluYWwgUHJvcGVydGllcyBvdXRwdXRQcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLQotCXB1YmxpYyBQcm9wZXJ0aWVzIGdldE91dHB1dFByb3BlcnRpZXMoKQotCXsKLQkJcmV0dXJuIG91dHB1dFByb3BlcnRpZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkT3V0cHV0UHJvcGVydHkoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkKLQl7Ci0JCW91dHB1dFByb3BlcnRpZXMucHV0KG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdDxMYXVuY2hUcmFuc2Zvcm0+IGdldFRyYW5zZm9ybURlZnMoKQotCXsKLQkJcmV0dXJuIHRyYW5zZm9ybURlZnM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VHJhbnNmb3JtRGVmcyhMaXN0PExhdW5jaFRyYW5zZm9ybT4gdHJhbnNmb3JtcykKLQl7Ci0JCXRyYW5zZm9ybURlZnMgPSB0cmFuc2Zvcm1zOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFRyYW5zZm9ybURlZihMYXVuY2hUcmFuc2Zvcm0gdGRlZikKLQl7Ci0JCXRkZWYuc2V0UGlwZWxpbmUodGhpcyk7Ci0JCXRyYW5zZm9ybURlZnMuYWRkKHRkZWYpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVRyYW5zZm9ybURlZihMYXVuY2hUcmFuc2Zvcm0gdGRlZikKLQl7Ci0JCXRyYW5zZm9ybURlZnMucmVtb3ZlKHRkZWYpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9YTUwoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJU3RyaW5nIHhtbCA9IG51bGw7Ci0JCXRyeQotCQl7Ci0JCQlEb2N1bWVudCBkb2MgPSBQcmVmZXJlbmNlVXRpbC5nZXREb2N1bWVudCgpOwotCQkJRWxlbWVudCByb290RWwgPSBkb2MuY3JlYXRlRWxlbWVudCgiUGlwZWxpbmUiKTsKLQkJCWRvYy5hcHBlbmRDaGlsZChyb290RWwpOwotCi0JCQlFbGVtZW50IG9wRWwgPSBkb2MuY3JlYXRlRWxlbWVudCgiT3V0cHV0UHJvcGVydGllcyIpOwotCQkJcm9vdEVsLmFwcGVuZENoaWxkKG9wRWwpOwotCQkJZm9yIChPYmplY3QgZWxlbWVudCA6IG91dHB1dFByb3BlcnRpZXMuZW50cnlTZXQoKSkKLQkJCXsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBlbGVtZW50OwotCQkJCUVsZW1lbnQgcHJvcEVsID0gZG9jLmNyZWF0ZUVsZW1lbnQoIlByb3BlcnR5Iik7Ci0JCQkJcHJvcEVsLnNldEF0dHJpYnV0ZSgibmFtZSIsIChTdHJpbmcpIGVudHJ5LmdldEtleSgpKTsKLQkJCQlwcm9wRWwuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIChTdHJpbmcpIGVudHJ5LmdldFZhbHVlKCkpOwotCQkJCW9wRWwuYXBwZW5kQ2hpbGQocHJvcEVsKTsKLQkJCX0KLQotCQkJZm9yIChJdGVyYXRvcjxMYXVuY2hUcmFuc2Zvcm0+IGl0ZXIgPSB0cmFuc2Zvcm1EZWZzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLQkJCXsKLQkJCQlMYXVuY2hUcmFuc2Zvcm0gdGRlZiA9IChMYXVuY2hUcmFuc2Zvcm0pIGl0ZXIubmV4dCgpOwotCQkJCUVsZW1lbnQgdGRlZkVsID0gdGRlZi5hc1hNTChkb2MpOwotCQkJCXJvb3RFbC5hcHBlbmRDaGlsZCh0ZGVmRWwpOwotCQkJfQotCi0JCQl4bWwgPSBQcmVmZXJlbmNlVXRpbC5zZXJpYWxpemVEb2N1bWVudChkb2MpOwotCQl9Ci0JCWNhdGNoIChET01FeGNlcHRpb24gZSkKLQkJewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lELCAwLCBlLmdldE1lc3NhZ2UoKSwgZSkpOwotCQl9Ci0JCWNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpCi0JCXsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCwgMCwgZS5nZXRNZXNzYWdlKCksIGUpKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkKLQkJewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lELCAwLCBlLmdldE1lc3NhZ2UoKSwgZSkpOwotCQl9Ci0JCWNhdGNoIChUcmFuc2Zvcm1lckV4Y2VwdGlvbiBlKQotCQl7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQsIDAsIGUuZ2V0TWVzc2FnZSgpLCBlKSk7Ci0JCX0KLQkJcmV0dXJuIHhtbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExhdW5jaFBpcGVsaW5lIGZyb21YTUwoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlEb2N1bWVudCBkb2MgPSBQcmVmZXJlbmNlVXRpbC5nZXREb2N1bWVudChpbnB1dFN0cmVhbSk7Ci0KLQkJTGF1bmNoUGlwZWxpbmUgcGRlZiA9IG5ldyBMYXVuY2hQaXBlbGluZSgpOwotCi0JCUVsZW1lbnQgcm9vdEVsID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpOwotCi0JCUVsZW1lbnQgb3BFbCA9IChFbGVtZW50KSByb290RWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk91dHB1dFByb3BlcnRpZXMiKS5pdGVtKDApOwotCQlpZiAob3BFbCAhPSBudWxsKQotCQl7Ci0JCQlOb2RlTGlzdCBwcm9wRWxzID0gb3BFbC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiUHJvcGVydHkiKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcEVscy5nZXRMZW5ndGgoKTsgaSsrKQotCQkJewotCQkJCUVsZW1lbnQgcHJvcEVsID0gKEVsZW1lbnQpIHByb3BFbHMuaXRlbShpKTsKLQkJCQlTdHJpbmcgbmFtZSA9IHByb3BFbC5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKLQkJCQlTdHJpbmcgdmFsdWUgPSBwcm9wRWwuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpOwotCQkJCXBkZWYuYWRkT3V0cHV0UHJvcGVydHkobmFtZSwgdmFsdWUpOwotCQkJfQotCQl9Ci0KLQkJTm9kZUxpc3QgdHJhbnNmb3JtRWxzID0gcm9vdEVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJUcmFuc2Zvcm0iKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0cmFuc2Zvcm1FbHMuZ2V0TGVuZ3RoKCk7IGkrKykKLQkJewotCQkJRWxlbWVudCB0cmFuc2Zvcm1FbCA9IChFbGVtZW50KSB0cmFuc2Zvcm1FbHMuaXRlbShpKTsKLQkJCUxhdW5jaFRyYW5zZm9ybSB0ZGVmID0gTGF1bmNoVHJhbnNmb3JtLmZyb21YTUwodHJhbnNmb3JtRWwpOwotCQkJcGRlZi5hZGRUcmFuc2Zvcm1EZWYodGRlZik7Ci0JCX0KLQotCQlyZXR1cm4gcGRlZjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9jb25maWcvTGF1bmNoUHJvcGVydGllcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvY29uZmlnL0xhdW5jaFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRkOTIxMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9jb25maWcvTGF1bmNoUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuY29uZmlnOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmcuUHJlZmVyZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotcHVibGljIGNsYXNzIExhdW5jaFByb3BlcnRpZXMKLXsKLQlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCi0JcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0UHJvcGVydGllcygpCi0JewotCQlyZXR1cm4gcHJvcGVydGllczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKQotCXsKLQkJcHJvcGVydGllcy5wdXQobmFtZSwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIG5hbWUpCi0JewotCQlyZXR1cm4gKFN0cmluZykgcHJvcGVydGllcy5nZXQobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHkoU3RyaW5nIG5hbWUpCi0JewotCQlwcm9wZXJ0aWVzLnJlbW92ZShuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvWE1MKCkgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIElPRXhjZXB0aW9uLCBUcmFuc2Zvcm1lckV4Y2VwdGlvbgotCXsKLQkJRG9jdW1lbnQgZG9jID0gUHJlZmVyZW5jZVV0aWwuZ2V0RG9jdW1lbnQoKTsKLQotCQlFbGVtZW50IGZlYXR1cmVzRWwgPSBkb2MuY3JlYXRlRWxlbWVudCgiUHJvcGVydGllcyIpOwotCQlkb2MuYXBwZW5kQ2hpbGQoZmVhdHVyZXNFbCk7Ci0KLQkJZm9yIChJdGVyYXRvcjw/PiBpdGVyID0gcHJvcGVydGllcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLQkJewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOwotCQkJU3RyaW5nIHZhbHVlID0gKFN0cmluZykgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJRWxlbWVudCBmZWF0dXJlRWwgPSBkb2MuY3JlYXRlRWxlbWVudCgiUHJvcGVydHkiKTsKLQkJCWZlYXR1cmVFbC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBuYW1lKTsKLQkJCWZlYXR1cmVFbC5zZXRBdHRyaWJ1dGUoInZhbHVlIiwgdmFsdWUpOwotCQkJZmVhdHVyZXNFbC5hcHBlbmRDaGlsZChmZWF0dXJlRWwpOwotCQl9Ci0KLQkJcmV0dXJuIFByZWZlcmVuY2VVdGlsLnNlcmlhbGl6ZURvY3VtZW50KGRvYyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBMYXVuY2hQcm9wZXJ0aWVzIGZyb21YTUwoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlEb2N1bWVudCBkb2MgPSBQcmVmZXJlbmNlVXRpbC5nZXREb2N1bWVudChpbnB1dFN0cmVhbSk7Ci0KLQkJTGF1bmNoUHJvcGVydGllcyBwZGVmID0gbmV3IExhdW5jaFByb3BlcnRpZXMoKTsKLQotCQlFbGVtZW50IGZlYXR1cmVzRWwgPSBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0KLQkJTm9kZUxpc3QgZmVhdHVyZUVscyA9IGZlYXR1cmVzRWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlByb3BlcnR5Iik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZUVscy5nZXRMZW5ndGgoKTsgaSsrKQotCQl7Ci0JCQlFbGVtZW50IGZlYXR1cmVFbCA9IChFbGVtZW50KSBmZWF0dXJlRWxzLml0ZW0oaSk7Ci0JCQlTdHJpbmcgbmFtZSA9IGZlYXR1cmVFbC5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKLQkJCVN0cmluZyB2YWx1ZSA9IGZlYXR1cmVFbC5nZXRBdHRyaWJ1dGUoInZhbHVlIik7Ci0JCQlwZGVmLnNldFByb3BlcnR5KG5hbWUsIHZhbHVlKTsKLQkJfQotCi0JCXJldHVybiBwZGVmOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL2NvbmZpZy9MYXVuY2hUcmFuc2Zvcm0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL2NvbmZpZy9MYXVuY2hUcmFuc2Zvcm0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIzZGZhNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9jb25maWcvTGF1bmNoVHJhbnNmb3JtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuY29uZmlnOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUudmFyaWFibGVzLlZhcmlhYmxlc1BsdWdpbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1wdWJsaWMgY2xhc3MgTGF1bmNoVHJhbnNmb3JtCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfVFlQRSA9ICJyZXNvdXJjZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURVJOQUxfVFlQRSA9ICJleHRlcm5hbCI7Ci0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBzdHlsZXNoZWV0OwotCXByaXZhdGUgZmluYWwgU3RyaW5nIHBhdGhUeXBlOwotCXByaXZhdGUgU3RyaW5nIHJlc29sdmVyOwotCXByaXZhdGUgZmluYWwgU2V0PExhdW5jaEF0dHJpYnV0ZT4gcGFyYW1ldGVycyA9IG5ldyBIYXNoU2V0PExhdW5jaEF0dHJpYnV0ZT4oKTsKLQlwcml2YXRlIExhdW5jaFBpcGVsaW5lIHBpcGVsaW5lOwotCi0JLyoqCi0JICogVGhlIHBhdGggbWF5IGJlIGFuIElSZXNvdXJjZSB0byBhIGZpbGUgaW4gdGhlIHdvcmtzcGFjZSwgb3IgYW4gSVBhdGggdG8gYQotCSAqIGZpbGUgb3V0c2lkZSBvZiB0aGUgd29ya3NwYWNlIC0gZGVwZW5kaW5nIG9uIHRoZSBwYXRoVHlwZS4gVGhlIHBhdGgKLQkgKiBzaG91bGQgYmUgY3JlYXRlZCB1c2luZyBJUGF0aC50b1BvcnRhYmxlU3RyaW5nKCkuIFRoZSBwYXRoIG1heSBhbHNvCi0JICogY29udGFpbiB2YXJpYWJsZXMgZGVmaW5lZCBieSB0aGUgVmFyaWFibGVQbHVnaW4uCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiBAcGFyYW0gcGF0aFR5cGUKLQkgKi8KLQlwdWJsaWMgTGF1bmNoVHJhbnNmb3JtKFN0cmluZyBwYXRoLCBTdHJpbmcgcGF0aFR5cGUpCi0JewotCQlzdHlsZXNoZWV0ID0gcGF0aDsKLQkJdGhpcy5wYXRoVHlwZSA9IHBhdGhUeXBlOwotCX0KLQotCXB1YmxpYyBTZXQ8TGF1bmNoQXR0cmlidXRlPiBnZXRQYXJhbWV0ZXJzKCkKLQl7Ci0JCXJldHVybiBwYXJhbWV0ZXJzOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFBhcmFtZXRlcihMYXVuY2hBdHRyaWJ1dGUgcGFyYW1ldGVyKQotCXsKLQkJcGFyYW1ldGVycy5hZGQocGFyYW1ldGVyKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFJlc29sdmVyKCkKLQl7Ci0JCXJldHVybiByZXNvbHZlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZXNvbHZlcihTdHJpbmcgcmVzb2x2ZXIpCi0JewotCQl0aGlzLnJlc29sdmVyID0gcmVzb2x2ZXI7Ci0JfQotCi0JcHVibGljIElQYXRoIGdldFBhdGgoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJU3RyaW5nIHN1YnN0aXR1dGVkVmFsdWUgPSBWYXJpYWJsZXNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0cmluZ1ZhcmlhYmxlTWFuYWdlcigpLnBlcmZvcm1TdHJpbmdTdWJzdGl0dXRpb24oc3R5bGVzaGVldCk7Ci0JCXJldHVybiBQYXRoLmZyb21Qb3J0YWJsZVN0cmluZyhzdWJzdGl0dXRlZFZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhdGhUeXBlKCkKLQl7Ci0JCXJldHVybiBwYXRoVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZnVsbCBwYXRoIHRvIHRoZSBmaWxlIGluIHRoZSBsb2NhbCBmaWxlIHN5c3RlbSAod2l0aCBhbnkgc3RyaW5nCi0JICogc3Vic2l0dXRpb25zIGFscmVhZHkgbWFkZSkuCi0JICogCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRMb2NhdGlvbigpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlJUGF0aCBwYXJ0aWFsUGF0aCA9IGdldFBhdGgoKTsKLQkJSVBhdGggZnVsbFBhdGggPSBudWxsOwotCQlpZiAoUkVTT1VSQ0VfVFlQRS5lcXVhbHMocGF0aFR5cGUpKQotCQl7Ci0JCQlJRmlsZSBmaWxlID0gKElGaWxlKSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIocGFydGlhbFBhdGgpOwotCQkJZnVsbFBhdGggPSBmaWxlLmdldExvY2F0aW9uKCk7Ci0JCX0KLQkJZWxzZSBpZiAoRVhURVJOQUxfVFlQRS5lcXVhbHMocGF0aFR5cGUpKQotCQl7Ci0JCQlmdWxsUGF0aCA9IHBhcnRpYWxQYXRoOwotCQl9Ci0JCXJldHVybiBmdWxsUGF0aDsKLQl9Ci0KLQlwdWJsaWMgRWxlbWVudCBhc1hNTChEb2N1bWVudCBkb2MpCi0JewotCQlFbGVtZW50IHRkZWZFbCA9IGRvYy5jcmVhdGVFbGVtZW50KCJUcmFuc2Zvcm0iKTsKLQkJdGRlZkVsLnNldEF0dHJpYnV0ZSgicGF0aCIsIHN0eWxlc2hlZXQpOwotCQl0ZGVmRWwuc2V0QXR0cmlidXRlKCJwYXRoVHlwZSIsIHBhdGhUeXBlKTsKLQkJaWYgKHJlc29sdmVyICE9IG51bGwpCi0JCQl0ZGVmRWwuc2V0QXR0cmlidXRlKCJ1cmlSZXNvbHZlciIsIHJlc29sdmVyKTsKLQkJRWxlbWVudCBwYXJhbXNFbCA9IGRvYy5jcmVhdGVFbGVtZW50KCJQYXJhbWV0ZXJzIik7Ci0JCXRkZWZFbC5hcHBlbmRDaGlsZChwYXJhbXNFbCk7Ci0JCWZvciAoSXRlcmF0b3I8TGF1bmNoQXR0cmlidXRlPiBpdGVyID0gcGFyYW1ldGVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0JCXsKLQkJCUxhdW5jaEF0dHJpYnV0ZSBwYXJhbSA9IChMYXVuY2hBdHRyaWJ1dGUpIGl0ZXIubmV4dCgpOwotCQkJRWxlbWVudCBwcm9wRWwgPSBkb2MuY3JlYXRlRWxlbWVudCgiUGFyYW1ldGVyIik7Ci0JCQlwcm9wRWwuc2V0QXR0cmlidXRlKCJuYW1lIiwgcGFyYW0udXJpKTsKLQkJCXByb3BFbC5zZXRBdHRyaWJ1dGUoInR5cGUiLCBwYXJhbS50eXBlKTsKLQkJCXByb3BFbC5zZXRBdHRyaWJ1dGUoInZhbHVlIiwgcGFyYW0udmFsdWUpOwotCQkJcGFyYW1zRWwuYXBwZW5kQ2hpbGQocHJvcEVsKTsKLQkJfQotCQlyZXR1cm4gdGRlZkVsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGF1bmNoVHJhbnNmb3JtIGZyb21YTUwoRWxlbWVudCB0cmFuc2Zvcm1FbCkKLQl7Ci0JCVN0cmluZyBwYXRoID0gdHJhbnNmb3JtRWwuZ2V0QXR0cmlidXRlKCJwYXRoIik7Ci0JCVN0cmluZyBwYXRoVHlwZSA9IHRyYW5zZm9ybUVsLmdldEF0dHJpYnV0ZSgicGF0aFR5cGUiKTsKLQotCQlMYXVuY2hUcmFuc2Zvcm0gdGRlZiA9IG5ldyBMYXVuY2hUcmFuc2Zvcm0ocGF0aCwgcGF0aFR5cGUpOwotCi0JCVN0cmluZyB1cmlSZXNvbHZlciA9IHRyYW5zZm9ybUVsLmdldEF0dHJpYnV0ZSgidXJpUmVzb2x2ZXIiKTsKLQkJdGRlZi5zZXRSZXNvbHZlcih1cmlSZXNvbHZlcik7Ci0KLQkJRWxlbWVudCBwYXJhbXNFbCA9IChFbGVtZW50KSB0cmFuc2Zvcm1FbC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiUGFyYW1ldGVycyIpLml0ZW0oMCk7Ci0JCU5vZGVMaXN0IHBhcmFtRWxzID0gcGFyYW1zRWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlBhcmFtZXRlciIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtRWxzLmdldExlbmd0aCgpOyBpKyspCi0JCXsKLQkJCUVsZW1lbnQgcGFyYW1FbCA9IChFbGVtZW50KSBwYXJhbUVscy5pdGVtKGkpOwotCQkJU3RyaW5nIG5hbWUgPSBwYXJhbUVsLmdldEF0dHJpYnV0ZSgibmFtZSIpOwotCQkJU3RyaW5nIHR5cGUgPSBwYXJhbUVsLmdldEF0dHJpYnV0ZSgidHlwZSIpOwotCQkJU3RyaW5nIHZhbHVlID0gcGFyYW1FbC5nZXRBdHRyaWJ1dGUoInZhbHVlIik7Ci0JCQl0ZGVmLmFkZFBhcmFtZXRlcihuZXcgTGF1bmNoQXR0cmlidXRlKG5hbWUsIHR5cGUsIHZhbHVlKSk7Ci0JCX0KLQotCQlyZXR1cm4gdGRlZjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQaXBlbGluZShMYXVuY2hQaXBlbGluZSBwaXBlbGluZSkKLQl7Ci0JCXRoaXMucGlwZWxpbmUgPSBwaXBlbGluZTsKLQl9Ci0KLQlwdWJsaWMgTGF1bmNoUGlwZWxpbmUgZ2V0UGlwZWxpbmUoKQotCXsKLQkJcmV0dXJuIHBpcGVsaW5lOwotCX0KLQotCS8qCi0JICogcHJpdmF0ZSBGaWxlIGdldFVSSVJlc29sdmVyRGlyZWN0b3J5KElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pCi0JICogdGhyb3dzIENvcmVFeGNlcHRpb24geyBGaWxlIHJlc29sdmVyRGlyID0gbnVsbDsgU3RyaW5nIGJhc2VVUklUeXBlID0KLQkgKiBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfQkFTRV9VUklfVFlQRSwKLQkgKiBYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkJBU0VfVVJJX1dPUktJTkdfRElSX1JFTEFUSVZFKTsgaWYKLQkgKiAoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5CQVNFX1VSSV9BQlNPTFVURS5lcXVhbHMoYmFzZVVSSVR5cGUpKSB7Ci0JICogU3RyaW5nIHVyaURpciA9Ci0JICogY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0JBU0VfVVJJX0RJUkVDVE9SWSwKLQkgKiAoU3RyaW5nKW51bGwpOyBpZiAodXJpRGlyIT1udWxsKSB7IFN0cmluZyBwYXRoRXhwciA9Ci0JICogVmFyaWFibGVzUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTdHJpbmdWYXJpYWJsZU1hbmFnZXIoKS5wZXJmb3JtU3RyaW5nU3Vic3RpdHV0aW9uKHVyaURpcik7Ci0JICogUGF0aCBwYXRoID0gbmV3IFBhdGgocGF0aEV4cHIpOyBpZiAocGF0aC5pc0Fic29sdXRlKCkpIHsgRmlsZSBkaXIgPSBuZXcKLQkgKiBGaWxlKHBhdGgudG9PU1N0cmluZygpKTsgaWYgKGRpci5pc0RpcmVjdG9yeSgpICYmIGRpci5leGlzdHMoKSkgeyByZXR1cm4KLQkgKiBkaXI7IH0gLy8gVGhpcyBtYXkgYmUgYSB3b3Jrc3BhY2UgcmVsYXRpdmUgcGF0aCByZXR1cm5lZCBieSBhIHZhcmlhYmxlLiAvLwotCSAqIEhvd2V2ZXIgdmFyaWFibGUgcGF0aHMgc3RhcnQgd2l0aCBhIHNsYXNoIGFuZCB0aHVzIGFyZSB0aG91Z2h0IHRvIC8vIGJlCi0JICogYWJzb2x1dGUsIHNvIGZhbGwgdGhyb3VnaCB0byBiZWxvdyB9IElSZXNvdXJjZSByZXMgPQotCSAqIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihwYXRoKTsgaWYgKHJlcwotCSAqIGluc3RhbmNlb2YgSUNvbnRhaW5lciAmJiByZXMuZXhpc3RzKCkpIHJldHVybiByZXMuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKTsKLQkgKiBhYm9ydCgiVVJJIHBhdGggaXMgaW52YWxpZCIsbnVsbCwwKTsgfSB9IGVsc2UgaWYKLQkgKiAoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5CQVNFX1VSSV9TVFlMRVNIRUVUX1JFTEFUSVZFLmVxdWFscyhiYXNlVVJJVHlwZSkpIHsKLQkgKiByZXNvbHZlckRpciA9IGdldFN0eWxlc2hlZXRSZWxhdGl2ZVVSSVJlc29sdmVyKGNvbmZpZ3VyYXRpb24pOyB9IC8vIG5vCi0JICogbmVlZCB0byBoYW5kbGUgdGhlIGNhc2Ugb2Ygd29ya2luZ19kaXIgcmVsYXRpdmUgLSB0aGlzIGlzIHRoZSBkZWZhdWx0IGZvcgotCSAqIEpBWFAgc28gcmV0dXJuIG51bGwgcmV0dXJuIHJlc29sdmVyRGlyOyB9Ci0JICogCi0JICogcHJpdmF0ZSBGaWxlIGdldFN0eWxlc2hlZXRSZWxhdGl2ZVVSSVJlc29sdmVyKElMYXVuY2hDb25maWd1cmF0aW9uCi0JICogY29uZmlndXJhdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24geyBMaXN0IHN0eWxlc2hlZXRzID0KLQkgKiBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfU1RZTEVTSEVFVFNfTElTVCwoTGlzdCludWxsKTsKLQkgKiBpZiAoc3R5bGVzaGVldHMgPT0gbnVsbCB8fCBzdHlsZXNoZWV0cy5zaXplKCkgPT0gMCkgYWJvcnQoIk5vIHN0eWxlc2hlZXRzCi0JICogZGVmaW5lZCBmb3IgdGhpcyBsYXVuY2ggY29uZmlndXJhdGlvbiIsIG51bGwsIDApOyBlbHNlIHsgU3RyaW5nIHNoZWV0ID0KLQkgKiAoU3RyaW5nKXN0eWxlc2hlZXRzLmdldCgwKTsgU3RyaW5nIHBhdGhFeHByID0KLQkgKiBWYXJpYWJsZXNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0cmluZ1ZhcmlhYmxlTWFuYWdlcigpLnBlcmZvcm1TdHJpbmdTdWJzdGl0dXRpb24oc2hlZXQpOwotCSAqIFBhdGggcGF0aCA9IG5ldyBQYXRoKHBhdGhFeHByKTsgaWYgKHBhdGguaXNBYnNvbHV0ZSgpKSB7IEZpbGUgZmlsZSA9IG5ldwotCSAqIEZpbGUocGF0aC50b09TU3RyaW5nKCkpOyBpZiAoZmlsZS5leGlzdHMoKSkgeyBGaWxlIGRpciA9Ci0JICogZmlsZS5nZXRQYXJlbnRGaWxlKCk7IHJldHVybiBkaXI7IH0gLy8gVGhpcyBtYXkgYmUgYSB3b3Jrc3BhY2UgcmVsYXRpdmUKLQkgKiBwYXRoIHJldHVybmVkIGJ5IGEgdmFyaWFibGUuIC8vIEhvd2V2ZXIgdmFyaWFibGUgcGF0aHMgc3RhcnQgd2l0aCBhIHNsYXNoCi0JICogYW5kIHRodXMgYXJlIHRob3VnaHQgdG8gLy8gYmUgYWJzb2x1dGUgSVJlc291cmNlIHJlcyA9Ci0JICogUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kTWVtYmVyKHBhdGgpOyBJQ29udGFpbmVyCi0JICogcGFyZW50ID0gcmVzLmdldFBhcmVudCgpOyBpZiAocGFyZW50LmV4aXN0cygpKSByZXR1cm4KLQkgKiBwYXJlbnQuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKTsgYWJvcnQoIlN0eWxlc2hlZXQgcGF0aCBpcwotCSAqIGludmFsaWQiLG51bGwsMCk7IH0gZWxzZSB7IElSZXNvdXJjZSByZXMgPQotCSAqIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihwYXRoKTsgSUNvbnRhaW5lcgotCSAqIHBhcmVudCA9IHJlcy5nZXRQYXJlbnQoKTsgaWYgKHBhcmVudC5leGlzdHMoKSkgcmV0dXJuCi0JICogcGFyZW50LmdldExvY2F0aW9uKCkudG9GaWxlKCk7IGFib3J0KCJTdHlsZXNoZWV0IHBhdGggaXMKLQkgKiBpbnZhbGlkIixudWxsLDApOyB9IH0gcmV0dXJuIG51bGw7IH0KLQkgKi8KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL21vZGVsL0lYU0xDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL21vZGVsL0lYU0xDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ0OWYzNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9tb2RlbC9JWFNMQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5tb2RlbDsKLQotcHVibGljIGludGVyZmFjZSBJWFNMQ29uc3RhbnRzCi17Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9YU0xfREVCVUdfTU9ERUwgPSAib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuWFNMRGVidWdNb2RlbCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFSS0VSX0lEID0gIm9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLnhzbExpbmVCcmVha3BvaW50TWFya2VyIjsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvbW9kZWwvSVhTTERlYnVnVGFyZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9tb2RlbC9JWFNMRGVidWdUYXJnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U5ZTU1NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9tb2RlbC9JWFNMRGVidWdUYXJnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSURlYnVnVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN0YWNrRnJhbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVmFsdWU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVhTTERlYnVnVGFyZ2V0IGV4dGVuZHMgSURlYnVnVGFyZ2V0Ci17Ci0JWFNMVmFyaWFibGUgZ2V0VmFyaWFibGUoaW50IHZhcklkKSB0aHJvd3MgRGVidWdFeGNlcHRpb247Ci0KLQlJU3RhY2tGcmFtZVtdIGdldFN0YWNrRnJhbWVzKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uOwotCi0Jdm9pZCBzdGVwSW50bygpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbjsKLQotCXZvaWQgc3RlcE92ZXIoKSB0aHJvd3MgRGVidWdFeGNlcHRpb247Ci0KLQl2b2lkIHN0ZXBSZXR1cm4oKSB0aHJvd3MgRGVidWdFeGNlcHRpb247Ci0KLQlJVmFsdWUgZ2V0VmFyaWFibGVWYWx1ZShYU0xWYXJpYWJsZSB2YXJpYWJsZSkgdGhyb3dzIERlYnVnRXhjZXB0aW9uOwkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL21vZGVsL1hTTERlYnVnRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvbW9kZWwvWFNMRGVidWdFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ODY1NTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvbW9kZWwvWFNMRGVidWdFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5EZWJ1Z0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JRGVidWdUYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JRGlzY29ubmVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklUZXJtaW5hdGU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBYU0xEZWJ1Z0VsZW1lbnQgZXh0ZW5kcyBEZWJ1Z0VsZW1lbnQgaW1wbGVtZW50cyBJRGlzY29ubmVjdAotewotCXB1YmxpYyBYU0xEZWJ1Z0VsZW1lbnQoSURlYnVnVGFyZ2V0IHRhcmdldCkKLQl7Ci0JCXN1cGVyKHRhcmdldCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNb2RlbElkZW50aWZpZXIoKQotCXsKLQkJcmV0dXJuIElYU0xDb25zdGFudHMuSURfWFNMX0RFQlVHX01PREVMOwotCX0KLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlpZiAoYWRhcHRlciA9PSBJVGVybWluYXRlLmNsYXNzKSB7Ci0JCQlyZXR1cm4gZ2V0RGVidWdUYXJnZXQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY2FuRGlzY29ubmVjdCgpCi0JewotCQlyZXR1cm4gZ2V0RGVidWdUYXJnZXQoKS5jYW5EaXNjb25uZWN0KCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc2Nvbm5lY3QoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQl7Ci0JCWdldERlYnVnVGFyZ2V0KCkuZGlzY29ubmVjdCgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0Rpc2Nvbm5lY3RlZCgpCi0JewotCQlyZXR1cm4gZ2V0RGVidWdUYXJnZXQoKS5pc0Rpc2Nvbm5lY3RlZCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL21vZGVsL1hTTERlYnVnVGFyZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9tb2RlbC9YU0xEZWJ1Z1RhcmdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODJiODcwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL21vZGVsL1hTTERlYnVnVGFyZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcubW9kZWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEubmV0LkNvbm5lY3RFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlNvY2tldDsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSURlYnVnVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSUxpbmVCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSU1lbW9yeUJsb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3RhY2tGcmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklUaHJlYWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Z2dlci5EZWJ1Z0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZy5MYXVuY2hpbmdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmcuWFNMVExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5JUHJvY2Vzc29ySW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5jb25maWcuTGF1bmNoSGVscGVyOwotCi1wdWJsaWMgY2xhc3MgWFNMRGVidWdUYXJnZXQgZXh0ZW5kcyBYU0xEZWJ1Z0VsZW1lbnQgaW1wbGVtZW50cyBJWFNMRGVidWdUYXJnZXQKLXsKLQlwcml2YXRlIGZpbmFsIGJ5dGVbXSBTVEFDS19GUkFNRVNfTE9DSyA9IG5ldyBieXRlWzBdOwotCXByaXZhdGUgZmluYWwgYnl0ZVtdIFZBTFVFX01BUF9MT0NLID0gbmV3IGJ5dGVbMF07Ci0JcHJpdmF0ZSBmaW5hbCBieXRlW10gV1JJVEVfTE9DSyA9IG5ldyBieXRlWzBdOwotCi0JcHJpdmF0ZSBmaW5hbCBpbnQgQ09OTkVDVF9BVFRFTVBUUyA9IDEwOwotCXByaXZhdGUgZmluYWwgaW50IENPTk5FQ1RfV0FJVCA9IDEwMDA7Ci0KLQlwcml2YXRlIGZpbmFsIElQcm9jZXNzIHByb2Nlc3M7Ci0JcHJpdmF0ZSBmaW5hbCBJTGF1bmNoIGxhdW5jaDsKLQlwcml2YXRlIFhTTFRocmVhZCB0aHJlYWQ7Ci0JcHJpdmF0ZSBJVGhyZWFkW10gdGhyZWFkczsKLQlwcml2YXRlIElTdGFja0ZyYW1lW10gc3RhY2tGcmFtZXNDYWNoZSA9IG5ldyBJU3RhY2tGcmFtZVswXTsKLQotCXByaXZhdGUgRXZlbnREaXNwYXRjaEpvYiBldmVudERpc3BhdGNoOwotCi0JcHJpdmF0ZSBmaW5hbCBNYXA8SW50ZWdlcixYU0xWYXJpYWJsZT4gdmFyaWFibGVNYXBDYWNoZSA9IG5ldyBIYXNoTWFwPEludGVnZXIsIFhTTFZhcmlhYmxlPigpOwotCXByaXZhdGUgZmluYWwgTWFwPFhTTFZhcmlhYmxlLCBYU0xWYWx1ZT4gdmFsdWVNYXBDYWNoZSA9IG5ldyBIYXNoTWFwPFhTTFZhcmlhYmxlLCBYU0xWYWx1ZT4oKTsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCXByaXZhdGUgYm9vbGVhbiBzdXNwZW5kZWQ7Ci0JcHJpdmF0ZSBib29sZWFuIHRlcm1pbmF0ZWQ7Ci0KLQlwcml2YXRlIFNvY2tldCByZXF1ZXN0U29ja2V0OwotCXByaXZhdGUgU29ja2V0IGV2ZW50U29ja2V0OwotCXByaXZhdGUgQnVmZmVyZWRSZWFkZXIgcmVxdWVzdFJlYWRlcjsKLQlwcml2YXRlIEJ1ZmZlcmVkUmVhZGVyIGV2ZW50UmVhZGVyOwotCXByaXZhdGUgUHJpbnRXcml0ZXIgcmVxdWVzdFdyaXRlcjsKLQlwcml2YXRlIGJvb2xlYW4gc3RhbGU7Ci0KLQlwdWJsaWMgWFNMRGVidWdUYXJnZXQoSUxhdW5jaCBsYXVuY2gsIElQcm9jZXNzIHByb2Nlc3MsIExhdW5jaEhlbHBlciBsYXVuY2hIZWxwZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlzdXBlcihudWxsKTsKLQkJdGhpcy5sYXVuY2ggPSBsYXVuY2g7Ci0JCXRoaXMucHJvY2VzcyA9IHByb2Nlc3M7Ci0JCXRoaXMucmVxdWVzdFNvY2tldCA9IGF0dGVtcHRDb25uZWN0KGxhdW5jaEhlbHBlci5nZXRSZXF1ZXN0UG9ydCgpKTsKLQkJdGhpcy5ldmVudFNvY2tldCA9IGF0dGVtcHRDb25uZWN0KGxhdW5jaEhlbHBlci5nZXRFdmVudFBvcnQoKSk7Ci0KLQkJaWYgKCFwcm9jZXNzLmlzVGVybWluYXRlZCgpKQotCQl7Ci0JCQl0cnkKLQkJCXsKLQkJCQl0aGlzLmV2ZW50UmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihldmVudFNvY2tldC5nZXRJbnB1dFN0cmVhbSgpKSk7Ci0JCQkJdGhpcy5yZXF1ZXN0V3JpdGVyID0gbmV3IFByaW50V3JpdGVyKHJlcXVlc3RTb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCkpOwotCQkJCXRoaXMucmVxdWVzdFJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIocmVxdWVzdFNvY2tldC5nZXRJbnB1dFN0cmVhbSgpKSk7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gZSkKLQkJCXsKLQkJCQlhYm9ydCgiVW5hYmxlIHRvIGNvbm5lY3QgdG8gZGVidWdnZXIiLCBlKTsKLQkJCX0KLQkJCXRoaXMudGhyZWFkID0gbmV3IFhTTFRocmVhZCh0aGlzKTsKLQkJCXRoaXMudGhyZWFkcyA9IG5ldyBJVGhyZWFkW117IHRocmVhZCB9OwotCQkJdGhpcy5ldmVudERpc3BhdGNoID0gbmV3IEV2ZW50RGlzcGF0Y2hKb2IoKTsKLQkJCXRoaXMuZXZlbnREaXNwYXRjaC5zY2hlZHVsZSgpOwotCQotCQkJRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJyZWFrcG9pbnRNYW5hZ2VyKCkuYWRkQnJlYWtwb2ludExpc3RlbmVyKHRoaXMpOwotCQl9Ci0JfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFib3J0KFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZSkgdGhyb3dzIERlYnVnRXhjZXB0aW9uCi0JewotCQlpZiAoIWdldERlYnVnVGFyZ2V0KCkuaXNUZXJtaW5hdGVkKCkpCi0JCQlnZXREZWJ1Z1RhcmdldCgpLmdldFByb2Nlc3MoKS50ZXJtaW5hdGUoKTsKLQkJdGhyb3cgbmV3IERlYnVnRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCwgRGVidWdQbHVnaW4uSU5URVJOQUxfRVJST1IsIG1lc3NhZ2UsIGUpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTb2NrZXQgYXR0ZW1wdENvbm5lY3QoaW50IHBvcnQpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlTb2NrZXQgc29ja2V0ID0gbnVsbDsKLQkJZm9yKGludCBpPTA7aTxDT05ORUNUX0FUVEVNUFRTO2krKykKLQkJewkKLQkJCS8vIGJyZWFrIG91dCBpZiBwcm9jZXNzIGlzIHRlcm1pbmF0ZWQKLQkJCWlmIChwcm9jZXNzLmlzVGVybWluYXRlZCgpKQotCQkJCWJyZWFrOwotCQkJdHJ5Ci0JCQl7Ci0JCQkJc29ja2V0ID0gbmV3IFNvY2tldCgibG9jYWxob3N0Iixwb3J0KTsKLQkJCX0KLQkJCWNhdGNoIChDb25uZWN0RXhjZXB0aW9uIGUpCi0JCQl7fQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0JCQl7fQotCQkJaWYgKHNvY2tldCAhPSBudWxsKQotCQkJCWJyZWFrOwotCQkJdHJ5Ci0JCQl7Ci0JCQkJVGhyZWFkLnNsZWVwKENPTk5FQ1RfV0FJVCk7Ci0JCQl9Ci0JCQljYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkKLQkJCXt9Ci0JCX0KLQkJaWYgKHNvY2tldCA9PSBudWxsICYmICFwcm9jZXNzLmlzVGVybWluYXRlZCgpKQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhTdGF0dXMuRVJST1IsIExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQsICJDb3VsZCBub3QgY29ubmVjdCB0byBzb2NrZXQgIitwb3J0KyIgYWZ0ZXIgIitDT05ORUNUX0FUVEVNUFRTKyIgYXR0ZW1wdHMiKSk7Ci0JCXJldHVybiBzb2NrZXQ7Ci0JfQotCi0JcHVibGljIElQcm9jZXNzIGdldFByb2Nlc3MoKQotCXsKLQkJcmV0dXJuIHByb2Nlc3M7Ci0JfQotCi0JcHVibGljIElUaHJlYWRbXSBnZXRUaHJlYWRzKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uCi0JewotCQlyZXR1cm4gdGhyZWFkczsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNUaHJlYWRzKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uCi0JewotCQlyZXR1cm4gdGhyZWFkcyAhPSBudWxsICYmIHRocmVhZHMubGVuZ3RoID4gMDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQl7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCXsKLQkJCXRyeQotCQkJewotCQkJCUlQcm9jZXNzb3JJbnN0YWxsIGluc3RhbGwgPSBYU0xUTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLmdldFByb2Nlc3Nvckluc3RhbGwoZ2V0TGF1bmNoKCkuZ2V0TGF1bmNoQ29uZmlndXJhdGlvbigpLCBJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFKTsKLQkJCQlTdHJpbmcgdHlwZSA9IGluc3RhbGwuZ2V0UHJvY2Vzc29yVHlwZSgpLmdldExhYmVsKCk7Ci0JCQkJbmFtZSA9IHR5cGUgKyAiIFsiICsgaW5zdGFsbC5nZXROYW1lKCkgKyAiXSI7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotCQkJewotCQkJCXRocm93IG5ldyBEZWJ1Z0V4Y2VwdGlvbihlLmdldFN0YXR1cygpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0JyZWFrcG9pbnQoSUJyZWFrcG9pbnQgYnJlYWtwb2ludCkKLQl7Ci0JCWlmIChicmVha3BvaW50LmdldE1vZGVsSWRlbnRpZmllcigpLmVxdWFscyhJWFNMQ29uc3RhbnRzLklEX1hTTF9ERUJVR19NT0RFTCkgJiYgYnJlYWtwb2ludCBpbnN0YW5jZW9mIElMaW5lQnJlYWtwb2ludCkKLQkJewotLy8JCQl0cnkKLS8vCQkJewotLy8JCQkJSUxpbmVCcmVha3BvaW50IGxiID0gKElMaW5lQnJlYWtwb2ludCkgYnJlYWtwb2ludDsKLS8vCQkJCUlNYXJrZXIgbWFya2VyID0gbGIuZ2V0TWFya2VyKCk7Ci0vLwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ZXIgPSBsYXVuY2hIZWxwZXIuZ2V0UGlwZWxpbmUoKS5nZXRUcmFuc2Zvcm1EZWZzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotLy8JCQkJewotLy8JCQkJCUxhdW5jaFRyYW5zZm9ybSBsdCA9IChMYXVuY2hUcmFuc2Zvcm0pIGl0ZXIubmV4dCgpOwotLy8JCQkJCWlmIChtYXJrZXIuZ2V0UmVzb3VyY2UoKS5nZXRMb2NhdGlvbigpLmVxdWFscyhsdC5nZXRMb2NhdGlvbigpKSkKLS8vCQkJCQkJcmV0dXJuIHRydWU7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLS8vCQkJewotLy8JCQkJTGF1bmNoaW5nUGx1Z2luLmxvZyhlKTsKLS8vCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJRGVidWdUYXJnZXQgZ2V0RGVidWdUYXJnZXQoKQotCXsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIElMYXVuY2ggZ2V0TGF1bmNoKCkKLQl7Ci0JCXJldHVybiBsYXVuY2g7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuVGVybWluYXRlKCkKLQl7Ci0JCXJldHVybiBnZXRQcm9jZXNzKCkuY2FuVGVybWluYXRlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNUZXJtaW5hdGVkKCkKLQl7Ci0JCXJldHVybiB0ZXJtaW5hdGVkOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlcm1pbmF0ZSgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCXsKLQkJc3luY2hyb25pemVkIChXUklURV9MT0NLKQotCQl7Ci0JCQlnZXRQcm9jZXNzKCkudGVybWluYXRlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5SZXN1bWUoKQotCXsKLQkJcmV0dXJuICFpc1Rlcm1pbmF0ZWQoKSAmJiBpc1N1c3BlbmRlZCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhblN1c3BlbmQoKQotCXsKLQkJcmV0dXJuICFpc1Rlcm1pbmF0ZWQoKSAmJiAhaXNTdXNwZW5kZWQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1N1c3BlbmRlZCgpCi0JewotCQlyZXR1cm4gc3VzcGVuZGVkOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc3VtZSgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCXsKLQkJc2VuZFJlcXVlc3QoRGVidWdDb25zdGFudHMuUkVRVUVTVF9SRVNVTUUpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZXN1bWVkKGludCBkZXRhaWwpCi0JewotCQlzdXNwZW5kZWQgPSBmYWxzZTsKLQkJdGhyZWFkLmZpcmVSZXN1bWVFdmVudChkZXRhaWwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzdXNwZW5kZWQoaW50IGRldGFpbCkKLQl7Ci0JCXN1c3BlbmRlZCA9IHRydWU7Ci0JCXRocmVhZC5maXJlU3VzcGVuZEV2ZW50KGRldGFpbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3VzcGVuZCgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCXsKLQkJc2VuZFJlcXVlc3QoRGVidWdDb25zdGFudHMuUkVRVUVTVF9TVVNQRU5EKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBicmVha3BvaW50QWRkZWQoSUJyZWFrcG9pbnQgYnJlYWtwb2ludCkKLQl7Ci0JCWlmIChzdXBwb3J0c0JyZWFrcG9pbnQoYnJlYWtwb2ludCkpCi0JCXsKLQkJCXRyeQotCQkJewotCQkJCUlMaW5lQnJlYWtwb2ludCBsYiA9IChJTGluZUJyZWFrcG9pbnQpIGJyZWFrcG9pbnQ7Ci0JCQkJaWYgKGJyZWFrcG9pbnQuaXNFbmFibGVkKCkpCi0JCQkJewotCQkJCQl0cnkKLQkJCQkJewotCQkJCQkJSU1hcmtlciBtYXJrZXIgPSBsYi5nZXRNYXJrZXIoKTsKLQkJCQkJCWlmIChtYXJrZXIgIT0gbnVsbCkKLQkJCQkJCXsKLQkJCQkJCQlVUkwgZmlsZSA9IG1hcmtlci5nZXRSZXNvdXJjZSgpLmdldExvY2F0aW9uKCkudG9GaWxlKCkudG9VUkkoKS50b1VSTCgpOwotCQkJCQkJCXNlbmRSZXF1ZXN0KERlYnVnQ29uc3RhbnRzLlJFUVVFU1RfQUREX0JSRUFLUE9JTlQgKyAiICIgKyBmaWxlICsgIiAiICsgbGIuZ2V0TGluZU51bWJlcigpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotCQkJCQl7Ci0JCQkJCQlMYXVuY2hpbmdQbHVnaW4ubG9nKGUpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLQkJCQkJewotCQkJCQkJTGF1bmNoaW5nUGx1Z2luLmxvZyhlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0JCQl7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBicmVha3BvaW50UmVtb3ZlZChJQnJlYWtwb2ludCBicmVha3BvaW50LCBJTWFya2VyRGVsdGEgZGVsdGEpCi0JewotCQlpZiAoc3VwcG9ydHNCcmVha3BvaW50KGJyZWFrcG9pbnQpKQotCQl7Ci0JCQl0cnkKLQkJCXsKLQkJCQlJTGluZUJyZWFrcG9pbnQgbGIgPSAoSUxpbmVCcmVha3BvaW50KSBicmVha3BvaW50OwotCQkJCUlNYXJrZXIgbWFya2VyID0gbGIuZ2V0TWFya2VyKCk7Ci0JCQkJaWYgKG1hcmtlciAhPSBudWxsKQotCQkJCXsKLQkJCQkJVVJMIGZpbGUgPSBtYXJrZXIuZ2V0UmVzb3VyY2UoKS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpLnRvVVJJKCkudG9VUkwoKTsKLQkJCQkJc2VuZFJlcXVlc3QoRGVidWdDb25zdGFudHMuUkVRVUVTVF9SRU1PVkVfQlJFQUtQT0lOVCArICIgIiArIGZpbGUgKyAiICIgKyBsYi5nZXRMaW5lTnVtYmVyKCkpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0JCQl7Ci0JCQkJTGF1bmNoaW5nUGx1Z2luLmxvZyhlKTsKLQkJCX0KLQkJCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLQkJCXsKLQkJCQlMYXVuY2hpbmdQbHVnaW4ubG9nKGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYnJlYWtwb2ludENoYW5nZWQoSUJyZWFrcG9pbnQgYnJlYWtwb2ludCwgSU1hcmtlckRlbHRhIGRlbHRhKQotCXsKLQkJaWYgKHN1cHBvcnRzQnJlYWtwb2ludChicmVha3BvaW50KSkKLQkJewotCQkJdHJ5Ci0JCQl7Ci0JCQkJaWYgKGJyZWFrcG9pbnQuaXNFbmFibGVkKCkpCi0JCQkJewotCQkJCQlicmVha3BvaW50QWRkZWQoYnJlYWtwb2ludCk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCWJyZWFrcG9pbnRSZW1vdmVkKGJyZWFrcG9pbnQsIG51bGwpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0JCQl7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5EaXNjb25uZWN0KCkKLQl7Ci0JCS8vIFRPRE8gaW1wbGVtZW50IGRpc2Nvbm5lY3QKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc2Nvbm5lY3QoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQl7Ci0JCS8vIFRPRE8gaW1wbGVtZW50IGRpc2Nvbm5lY3QKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0Rpc2Nvbm5lY3RlZCgpCi0JewotCQkvLyBUT0RPIGltcGxlbWVudCBkaXNjb25uZWN0Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1N0b3JhZ2VSZXRyaWV2YWwoKQotCXsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBJTWVtb3J5QmxvY2sgZ2V0TWVtb3J5QmxvY2sobG9uZyBzdGFydEFkZHJlc3MsIGxvbmcgbGVuZ3RoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCByZWFkeSgpCi0JewotCQlmaXJlQ3JlYXRpb25FdmVudCgpOwotCQlpbnN0YWxsRGVmZXJyZWRCcmVha3BvaW50cygpOwotCQl0cnkKLQkJewotCQkJc2VuZFJlcXVlc3QoRGVidWdDb25zdGFudHMuUkVRVUVTVF9TVEFSVCk7Ci0JCX0KLQkJY2F0Y2ggKERlYnVnRXhjZXB0aW9uIGUpCi0JCXsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbnN0YWxsIGJyZWFrcG9pbnRzIHRoYXQgYXJlIGFscmVhZHkgcmVnaXN0ZXJlZCB3aXRoIHRoZSBicmVha3BvaW50Ci0JICogbWFuYWdlci4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5zdGFsbERlZmVycmVkQnJlYWtwb2ludHMoKQotCXsKLQkJSUJyZWFrcG9pbnRbXSBicmVha3BvaW50cyA9IERlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCcmVha3BvaW50TWFuYWdlcigpLmdldEJyZWFrcG9pbnRzKElYU0xDb25zdGFudHMuSURfWFNMX0RFQlVHX01PREVMKTsKLQkJZm9yIChJQnJlYWtwb2ludCBlbGVtZW50IDogYnJlYWtwb2ludHMpCi0JCXsKLQkJCWJyZWFrcG9pbnRBZGRlZChlbGVtZW50KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB0ZXJtaW5hdGVkKCkKLQl7Ci0JCXRlcm1pbmF0ZWQgPSB0cnVlOwotCQlzdXNwZW5kZWQgPSB0cnVlOwotCQlEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnJlYWtwb2ludE1hbmFnZXIoKS5yZW1vdmVCcmVha3BvaW50TGlzdGVuZXIodGhpcyk7Ci0KLQkJdGhyZWFkcyA9IG5ldyBJVGhyZWFkWzBdOwotCi0JCWZpcmVUZXJtaW5hdGVFdmVudCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgc3RhY2sgZnJhbWVzIGluIHRoZSB0YXJnZXQuCi0JICovCi0JcHVibGljIElTdGFja0ZyYW1lW10gZ2V0U3RhY2tGcmFtZXMoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQl7Ci0JCXN5bmNocm9uaXplZCAoU1RBQ0tfRlJBTUVTX0xPQ0spCi0JCXsKLQkJCWlmIChzdGFsZSkKLQkJCXsKLQkJCQlzdGFsZSA9IGZhbHNlOwotCQkJCVN0cmluZyBmcmFtZXNEYXRhID0gc2VuZFJlcXVlc3QoRGVidWdDb25zdGFudHMuUkVRVUVTVF9TVEFDSyk7Ci0JCQkJU3RyaW5nW10gZnJhbWVzID0gZnJhbWVzRGF0YS5zcGxpdCgiXFwkXFwkXFwkIik7Ci0JCQkJSVN0YWNrRnJhbWVbXSBzZiA9IG5ldyBJU3RhY2tGcmFtZVtmcmFtZXMubGVuZ3RoXTsKLQkJCQlMaXN0PElTdGFja0ZyYW1lPiBjdXJyZW50RnJhbWVzID0gQXJyYXlzLmFzTGlzdChzdGFja0ZyYW1lc0NhY2hlKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lcy5sZW5ndGg7IGkrKykKLQkJCQl7Ci0JCQkJCVN0cmluZyBkYXRhID0gZnJhbWVzW2ldOwotCQkJCQlYU0xTdGFja0ZyYW1lIGZyYW1lID0gbmV3IFhTTFN0YWNrRnJhbWUodGhyZWFkLCBkYXRhLCBpKTsKLQkJCQkJaW50IGluZGV4OwotCQkJCQlpZiAoKGluZGV4ID0gY3VycmVudEZyYW1lcy5pbmRleE9mKGZyYW1lKSkgIT0gLTEpCi0JCQkJCXsKLQkJCQkJCVhTTFN0YWNrRnJhbWUgY3VyciA9IChYU0xTdGFja0ZyYW1lKWN1cnJlbnRGcmFtZXMuZ2V0KGluZGV4KTsKLQkJCQkJCWN1cnIuc2V0TGluZU51bWJlcihmcmFtZS5nZXRMaW5lTnVtYmVyKCkpOwotCQkJCQkJY3Vyci5zZXRWYXJpYWJsZXMoZnJhbWUuZ2V0VmFyaWFibGVzKCkpOwotCQkJCQkJZnJhbWUgPSBjdXJyOwotCQkJCQl9Ci0JCQkJCXNmW2ZyYW1lcy5sZW5ndGggLSBpIC0gMV0gPSBmcmFtZTsKLQkJCQl9Ci0JCQkJc3RhY2tGcmFtZXNDYWNoZSA9IHNmOwotCQkJfQotCQkJcmV0dXJuIHN0YWNrRnJhbWVzQ2FjaGU7Ci0JCX0KLQl9Ci0JCi0vKgotCXByaXZhdGUgdm9pZCBpbml0KFN0cmluZyBkYXRhKQotCXsKLQotCQlTdHJpbmdbXSBzdHJpbmdzID0gZGF0YS5zcGxpdCgiXFx8Iik7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IHN0cmluZ3NbMF07Ci0JCXRyeQotCQl7Ci0JCQlVUkwgdXJsID0gbmV3IFVSTChmaWxlTmFtZSk7Ci0JCQlQYXRoIHAgPSBuZXcgUGF0aCh1cmwuZ2V0RmlsZSgpKTsKLQkJCXhzbEZpbGVOYW1lID0gKG5ldyBQYXRoKGZpbGVOYW1lKSkubGFzdFNlZ21lbnQoKTsKLQotCQkJU3RyaW5nIGlkU3RyaW5nID0gc3RyaW5nc1sxXTsKLQkJCWlkID0gSW50ZWdlci5wYXJzZUludChpZFN0cmluZyk7Ci0JCQlTdHJpbmcgcGMgPSBzdHJpbmdzWzJdOwotCQkJbGluZU51bWJlciA9IEludGVnZXIucGFyc2VJbnQocGMpOwotCQkJU3RyaW5nIHNhZmVuYW1lID0gc3RyaW5nc1szXTsKLQotCQkJaW50IHRoZUluZGV4OwotCQkJd2hpbGUgKCh0aGVJbmRleCA9IHNhZmVuYW1lLmluZGV4T2YoIiVAX1BJUEVfQCUiKSkgIT0gLTEpCi0JCQl7Ci0JCQkJc2FmZW5hbWUgPSBzYWZlbmFtZS5zdWJzdHJpbmcoMCwgdGhlSW5kZXgpICsgInwiICsgc2FmZW5hbWUuc3Vic3RyaW5nKHRoZUluZGV4ICsgIiVAX1BJUEVfQCUiLmxlbmd0aCgpLCBzYWZlbmFtZS5sZW5ndGgoKSk7Ci0JCQl9Ci0KLQkJCW5hbWUgPSBwLmxhc3RTZWdtZW50KCkgKyAiICIgKyBzYWZlbmFtZTsKLQotCQkJaW50IG51bVZhcnMgPSBzdHJpbmdzLmxlbmd0aCAtIDQ7Ci0JCQl2YXJpYWJsZXMgPSBuZXcgSVZhcmlhYmxlW251bVZhcnNdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1WYXJzOyBpKyspCi0JCQl7Ci0JCQkJU3RyaW5nIHZhbCA9IHN0cmluZ3NbaSArIDRdOwotCQkJCWludCBpbmRleCA9IHZhbC5sYXN0SW5kZXhPZignJicpOwotCQkJCWludCBzbG90TnVtYmVyID0gSW50ZWdlci5wYXJzZUludCh2YWwuc3Vic3RyaW5nKGluZGV4ICsgMSkpOwotCQkJCXZhbCA9IHZhbC5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQkJCWluZGV4ID0gdmFsLmxhc3RJbmRleE9mKCcmJyk7Ci0JCQkJU3RyaW5nIG5hbWUgPSB2YWwuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCQlTdHJpbmcgc2NvcGUgPSB2YWwuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0JCQkJdmFyaWFibGVzW2ldID0gbmV3IFhTTFZhcmlhYmxlKHRoaXMsIHNjb3BlLCBuYW1lLCBzbG90TnVtYmVyKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpCi0JCXsKLQkJCUxhdW5jaGluZ1BsdWdpbi5sb2coZSk7Ci0JCX0KLQl9Ci0qLwotCi0JcHJpdmF0ZSB2b2lkIHJlc3NldFN0YWNrRnJhbWVzQ2FjaGUoKQotCXsKLQkJc3RhbGUgPSB0cnVlOwotCQlzeW5jaHJvbml6ZWQgKFZBTFVFX01BUF9MT0NLKQotCQl7Ci0JCQl2YWx1ZU1hcENhY2hlLmNsZWFyKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTaW5nbGUgc3RlcCB0aGUgaW50ZXJwcmV0ZXIuCi0JICovCi0JcHVibGljIHZvaWQgc3RlcE92ZXIoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQl7Ci0JCXNlbmRSZXF1ZXN0KERlYnVnQ29uc3RhbnRzLlJFUVVFU1RfU1RFUF9PVkVSKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGVwSW50bygpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCXsKLQkJc2VuZFJlcXVlc3QoRGVidWdDb25zdGFudHMuUkVRVUVTVF9TVEVQX0lOVE8pOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0ZXBSZXR1cm4oKSB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQl7Ci0JCXNlbmRSZXF1ZXN0KERlYnVnQ29uc3RhbnRzLlJFUVVFU1RfU1RFUF9SRVRVUk4pOwotCX0KLQotCXB1YmxpYyBYU0xWYXJpYWJsZSBnZXRWYXJpYWJsZShpbnQgdmFySWQpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCXsKLQkJc3luY2hyb25pemVkICh2YXJpYWJsZU1hcENhY2hlKQotCQl7Ci0JCQlYU0xWYXJpYWJsZSB2YXIgPSB2YXJpYWJsZU1hcENhY2hlLmdldCh2YXJJZCk7Ci0JCQlpZiAodmFyID09IG51bGwpCi0JCQl7Ci0JCQkJdmFyID0gbmV3IFhTTFZhcmlhYmxlKHRoaXMsdmFySWQpOwotCQkJCVN0cmluZyByZXMgPSBzZW5kUmVxdWVzdChEZWJ1Z0NvbnN0YW50cy5SRVFVRVNUX1ZBUklBQkxFICsgIiAiICsgdmFySWQpOwotCQkJCVN0cmluZ1tdIGRhdGEgPSByZXMuc3BsaXQoIiYiKTsKLQkJCQl2YXIuc2V0U2NvcGUoZGF0YVswXSk7Ci0JCQkJdmFyLnNldE5hbWUoZGF0YVsxXSk7Ci0JCQkJdmFyaWFibGVNYXBDYWNoZS5wdXQodmFySWQsdmFyKTsKLQkJCX0KLQkJCXJldHVybiB2YXI7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSVZhbHVlIGdldFZhcmlhYmxlVmFsdWUoWFNMVmFyaWFibGUgdmFyaWFibGUpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCXsKLQkJc3luY2hyb25pemVkIChWQUxVRV9NQVBfTE9DSykKLQkJewotCQkJWFNMVmFsdWUgdmFsdWUgPSAoWFNMVmFsdWUpIHZhbHVlTWFwQ2FjaGUuZ2V0KHZhcmlhYmxlKTsKLQkJCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJewotCQkJCWlmIChpc1N1c3BlbmRlZCgpKQotCQkJCXsKLQkJCQkJU3RyaW5nIHJlcyA9IHNlbmRSZXF1ZXN0KERlYnVnQ29uc3RhbnRzLlJFUVVFU1RfVkFMVUUgKyAiICIgKyB2YXJpYWJsZS5nZXRJZCgpKTsKLQkJCQkJU3RyaW5nW10gZGF0YSA9IHJlcy5zcGxpdCgiJiIpOwotCQkJCQlTdHJpbmcgdHlwZSA9IGRhdGFbMF07Ci0JCQkJCVN0cmluZyB0aGV2YWw7Ci0JCQkJCWlmIChkYXRhLmxlbmd0aCA+IDEpCi0JCQkJCQl0aGV2YWwgPSBkYXRhWzFdOwotCQkJCQllbHNlCi0JCQkJCQl0aGV2YWwgPSAiIjsKLQkJCQkJdmFsdWUgPSBuZXcgWFNMVmFsdWUodGhpcywgdHlwZSwgdGhldmFsKTsKLQkJCQkJdmFsdWVNYXBDYWNoZS5wdXQodmFyaWFibGUsIHZhbHVlKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJLy8gYW55dGhpbmcgYXMgbG9uZyBhcyBub3QgbnVsbCEKLQkJCQkJdmFsdWUgPSBuZXcgWFNMVmFsdWUodGhpcywgIkciLCAiIik7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHZhbHVlOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgc2VuZFJlcXVlc3QoU3RyaW5nIHJlcXVlc3QpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCXsKLQkJU3RyaW5nIHJlc3BvbnNlID0gbnVsbDsKLQkJc3luY2hyb25pemVkIChXUklURV9MT0NLKQotCQl7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlJFUVVFU1Q6ICIgKyByZXF1ZXN0KTsKLQkJCXJlcXVlc3RXcml0ZXIucHJpbnRsbihyZXF1ZXN0KTsKLQkJCXJlcXVlc3RXcml0ZXIuZmx1c2goKTsKLQkJCXRyeQotCQkJewotCQkJCS8vIHdhaXQgZm9yIHJlc3BvbnNlCi0JCQkJcmVzcG9uc2UgPSByZXF1ZXN0UmVhZGVyLnJlYWRMaW5lKCk7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJSRVNQT05TRTogIiArIHJlc3BvbnNlKTsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKQotCQkJewotCQkJCWFib3J0KCJSZXF1ZXN0IGZhaWxlZDogIiArIHJlcXVlc3QsIGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXNwb25zZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnJlYWtwb2ludEhpdChTdHJpbmcgZXZlbnQpCi0JewotCQkvLyBkZXRlcm1pbmUgd2hpY2ggYnJlYWtwb2ludCB3YXMgaGl0LCBhbmQgc2V0IHRoZSB0aHJlYWQncyBicmVha3BvaW50Ci0JCWludCBsYXN0U3BhY2UgPSBldmVudC5sYXN0SW5kZXhPZignICcpOwotCQlpZiAobGFzdFNwYWNlID4gMCkKLQkJewotCQkJU3RyaW5nIGxpbmUgPSBldmVudC5zdWJzdHJpbmcobGFzdFNwYWNlICsgMSk7Ci0JCQlpbnQgbGluZU51bWJlciA9IEludGVnZXIucGFyc2VJbnQobGluZSk7Ci0JCQlJQnJlYWtwb2ludFtdIGJyZWFrcG9pbnRzID0gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJyZWFrcG9pbnRNYW5hZ2VyKCkuZ2V0QnJlYWtwb2ludHMoSVhTTENvbnN0YW50cy5JRF9YU0xfREVCVUdfTU9ERUwpOwotCQkJZm9yIChJQnJlYWtwb2ludCBicmVha3BvaW50IDogYnJlYWtwb2ludHMpCi0JCQl7Ci0JCQkJaWYgKHN1cHBvcnRzQnJlYWtwb2ludChicmVha3BvaW50KSkKLQkJCQl7Ci0JCQkJCWlmIChicmVha3BvaW50IGluc3RhbmNlb2YgSUxpbmVCcmVha3BvaW50KQotCQkJCQl7Ci0JCQkJCQlJTGluZUJyZWFrcG9pbnQgbGluZUJyZWFrcG9pbnQgPSAoSUxpbmVCcmVha3BvaW50KSBicmVha3BvaW50OwotCQkJCQkJdHJ5Ci0JCQkJCQl7Ci0JCQkJCQkJaWYgKGxpbmVCcmVha3BvaW50LmdldExpbmVOdW1iZXIoKSA9PSBsaW5lTnVtYmVyKQotCQkJCQkJCXsKLQkJCQkJCQkJdGhyZWFkLnNldEJyZWFrcG9pbnRzKG5ldyBJQnJlYWtwb2ludFtdeyBicmVha3BvaW50IH0pOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotCQkJCQkJewotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1c3BlbmRlZChEZWJ1Z0V2ZW50LkJSRUFLUE9JTlQpOwotCX0KLQotCXByaXZhdGUgY2xhc3MgRXZlbnREaXNwYXRjaEpvYiBleHRlbmRzIEpvYgotCXsKLQotCQlwdWJsaWMgRXZlbnREaXNwYXRjaEpvYigpCi0JCXsKLQkJCXN1cGVyKCJFdmVudCBEaXNwYXRjaCIpOwotCQkJc2V0U3lzdGVtKHRydWUpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCXsKLQkJCVN0cmluZyBldmVudCA9ICIiOwotCQkJd2hpbGUgKCFpc1Rlcm1pbmF0ZWQoKSAmJiBldmVudCAhPSBudWxsKQotCQkJewotCQkJCXRyeQotCQkJCXsKLQkJCQkJZXZlbnQgPSBldmVudFJlYWRlci5yZWFkTGluZSgpOwotCQkJCQlpZiAoZXZlbnQgIT0gbnVsbCkKLQkJCQkJewotCQkJCQkJdGhyZWFkLnNldEJyZWFrcG9pbnRzKG51bGwpOwotCQkJCQkJdGhyZWFkLnNldFN0ZXBwaW5nKGZhbHNlKTsKLQkJCQkJCWlmIChldmVudC5lcXVhbHMoInJlYWR5IikpCi0JCQkJCQl7Ci0JCQkJCQkJcmVhZHkoKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKGV2ZW50LmVxdWFscygic3RvcHBlZCIpKQotCQkJCQkJewotCQkJCQkJCXRyeQotCQkJCQkJCXsKLQkJCQkJCQkJdGVybWluYXRlKCk7Ci0JCQkJCQkJfQotCQkJCQkJCWNhdGNoIChEZWJ1Z0V4Y2VwdGlvbiBlKQotCQkJCQkJCXsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChldmVudC5lcXVhbHMoInRlcm1pbmF0ZWQiKSkKLQkJCQkJCXsKLQkJCQkJCQl0ZXJtaW5hdGVkKCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChldmVudC5zdGFydHNXaXRoKCJyZXN1bWVkIikpCi0JCQkJCQl7Ci0JCQkJCQkJaWYgKGV2ZW50LmVuZHNXaXRoKCJzdGVwIikpCi0JCQkJCQkJewotCQkJCQkJCQl0aHJlYWQuc2V0U3RlcHBpbmcodHJ1ZSk7Ci0JCQkJCQkJCXJlc3VtZWQoRGVidWdFdmVudC5TVEVQX09WRVIpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIGlmIChldmVudC5lbmRzV2l0aCgiY2xpZW50IikpCi0JCQkJCQkJewotCQkJCQkJCQlyZXN1bWVkKERlYnVnRXZlbnQuQ0xJRU5UX1JFUVVFU1QpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlCi0JCQkJCQkJewotCQkJCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkRpZCBub3QgdW5kZXJzdGFuZCBldmVudDoKLQkJCQkJCQkJLy8gIiArIGV2ZW50KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChldmVudC5zdGFydHNXaXRoKCJzdXNwZW5kZWQiKSkKLQkJCQkJCXsKLQkJCQkJCQkvLyBjbGVhciBkb3duIHRoZSBmcmFtZXMgc28gdGhhdCB0aGV5IGFyZSByZS1mZXRjaGVkCi0JCQkJCQkJcmVzc2V0U3RhY2tGcmFtZXNDYWNoZSgpOwotCQkJCQkJCWlmIChldmVudC5lbmRzV2l0aCgiY2xpZW50IikpCi0JCQkJCQkJewotCQkJCQkJCQlzdXNwZW5kZWQoRGVidWdFdmVudC5DTElFTlRfUkVRVUVTVCk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgaWYgKGV2ZW50LmVuZHNXaXRoKCJzdGVwIikpCi0JCQkJCQkJewotCQkJCQkJCQlzdXNwZW5kZWQoRGVidWdFdmVudC5TVEVQX0VORCk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgaWYgKGV2ZW50LmluZGV4T2YoImJyZWFrcG9pbnQiKSA+PSAwKQotCQkJCQkJCXsKLQkJCQkJCQkJYnJlYWtwb2ludEhpdChldmVudCk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UKLQkJCQkJCQl7Ci0JCQkJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRGlkIG5vdCB1bmRlcnN0YW5kIGV2ZW50OgotCQkJCQkJCQkvLyAiICsgZXZlbnQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWVsc2UKLQkJCQkJCXsKLQkJCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkRpZCBub3QgdW5kZXJzdGFuZCBldmVudDogIiArCi0JCQkJCQkJLy8gZXZlbnQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKQotCQkJCXsKLQkJCQkJdGVybWluYXRlZCgpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvbW9kZWwvWFNMTGluZUJyZWFrcG9pbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL21vZGVsL1hTTExpbmVCcmVha3BvaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkOGU0Y2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvbW9kZWwvWFNMTGluZUJyZWFrcG9pbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgQmpvcm4gRnJlZW1hbi1CZW5zb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSUJyZWFrcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5MaW5lQnJlYWtwb2ludDsKLQotcHVibGljIGNsYXNzIFhTTExpbmVCcmVha3BvaW50IGV4dGVuZHMgTGluZUJyZWFrcG9pbnQKLXsKLQlwcml2YXRlIGludCBsaW5lTnVtYmVyOwotCi0JcHVibGljIFhTTExpbmVCcmVha3BvaW50KCkKLQl7Ci0JfQotCi0JcHVibGljIFhTTExpbmVCcmVha3BvaW50KGZpbmFsIElSZXNvdXJjZSByZXNvdXJjZSwgZmluYWwgaW50IGxpbmVOdW1iZXIsIGZpbmFsIGludCBjaGFyU3RhcnQsIGZpbmFsIGludCBjaGFyRW5kKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJdGhpcy5saW5lTnVtYmVyID0gbGluZU51bWJlcjsKLQkJSVdvcmtzcGFjZVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpCi0JCXsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JCQl7Ci0JCQkJSU1hcmtlciBtYXJrZXIgPSByZXNvdXJjZS5jcmVhdGVNYXJrZXIoSVhTTENvbnN0YW50cy5NQVJLRVJfSUQpOwotCQkJCXNldE1hcmtlcihtYXJrZXIpOwotCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSUJyZWFrcG9pbnQuSUQsIGdldE1vZGVsSWRlbnRpZmllcigpKTsKLQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKElCcmVha3BvaW50LkVOQUJMRUQsIEJvb2xlYW4uVFJVRSk7Ci0JCQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UsICJMaW5lIEJyZWFrcG9pbnQ6ICIgKyByZXNvdXJjZS5nZXROYW1lKCkgKyAiIFtsaW5lOiAiICsgbGluZU51bWJlciArICJdIik7Ci0KLQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuTElORV9OVU1CRVIsIGxpbmVOdW1iZXIpOwotCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX1NUQVJULCBuZXcgSW50ZWdlcihjaGFyU3RhcnQpKTsKLQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9FTkQsIG5ldyBJbnRlZ2VyKGNoYXJFbmQpKTsKLQotCQkJCXJlZ2lzdGVyKHRydWUpOwotCQkJfQotCQl9OwotCQlydW4oZ2V0TWFya2VyUnVsZShyZXNvdXJjZSksIHJ1bm5hYmxlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGdldExpbmVOdW1iZXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJaW50IGxpbmUgPSBzdXBlci5nZXRMaW5lTnVtYmVyKCk7Ci0JCXJldHVybiBsaW5lID09IC0xID8gbGluZU51bWJlciA6IGxpbmU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXIoYm9vbGVhbiByZWdpc3RlcikgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCURlYnVnUGx1Z2luIHBsdWdpbiA9IERlYnVnUGx1Z2luLmdldERlZmF1bHQoKTsKLQkJaWYgKHBsdWdpbiAhPSBudWxsICYmIHJlZ2lzdGVyKQotCQl7Ci0JCQlwbHVnaW4uZ2V0QnJlYWtwb2ludE1hbmFnZXIoKS5hZGRCcmVha3BvaW50KHRoaXMpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJc2V0UmVnaXN0ZXJlZChmYWxzZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1vZGVsSWRlbnRpZmllcigpCi0JewotCQlyZXR1cm4gSVhTTENvbnN0YW50cy5JRF9YU0xfREVCVUdfTU9ERUw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvbW9kZWwvWFNMU3RhY2tGcmFtZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvbW9kZWwvWFNMU3RhY2tGcmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTBhZTFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL21vZGVsL1hTTFN0YWNrRnJhbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5tb2RlbDsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSURlYnVnVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVJlZ2lzdGVyR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3RhY2tGcmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklUaHJlYWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmcuTGF1bmNoaW5nUGx1Z2luOwotCi0vKioKLSAqIFhTTCBzdGFjayBmcmFtZS4KLSAqLwotcHVibGljIGNsYXNzIFhTTFN0YWNrRnJhbWUgZXh0ZW5kcyBYU0xEZWJ1Z0VsZW1lbnQgaW1wbGVtZW50cyBJU3RhY2tGcmFtZQotewotCXByaXZhdGUgZmluYWwgWFNMVGhyZWFkIHhzbFRocmVhZDsKLQlwcml2YXRlIGludCBpZDsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCXByaXZhdGUgaW50IGxpbmVOdW1iZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgeHNsRmlsZU5hbWU7Ci0JcHJpdmF0ZSBJVmFyaWFibGVbXSB2YXJpYWJsZXM7Ci0KLQlwdWJsaWMgWFNMU3RhY2tGcmFtZShYU0xUaHJlYWQgdGhyZWFkLCBTdHJpbmcgZGF0YSwgaW50IGluZGV4KQotCXsKLQkJc3VwZXIodGhyZWFkLmdldERlYnVnVGFyZ2V0KCkpOwotCQl0aGlzLnhzbFRocmVhZCA9IHRocmVhZDsKLQkJaW5pdChkYXRhLChJWFNMRGVidWdUYXJnZXQpIHRocmVhZC5nZXREZWJ1Z1RhcmdldCgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdChTdHJpbmcgZGF0YSxJWFNMRGVidWdUYXJnZXQgZGVidWdUYXJnZXQpCi0JewotCi0JCVN0cmluZ1tdIHN0cmluZ3MgPSBkYXRhLnNwbGl0KCJcXHwiKTsKLQkJU3RyaW5nIGZpbGVOYW1lID0gc3RyaW5nc1swXTsKLQkJdHJ5Ci0JCXsKLQkJCVVSTCB1cmwgPSBuZXcgVVJMKGZpbGVOYW1lKTsKLQkJCVBhdGggcCA9IG5ldyBQYXRoKHVybC5nZXRGaWxlKCkpOwotCQkJeHNsRmlsZU5hbWUgPSAobmV3IFBhdGgoZmlsZU5hbWUpKS5sYXN0U2VnbWVudCgpOwotCi0JCQlTdHJpbmcgaWRTdHJpbmcgPSBzdHJpbmdzWzFdOwotCQkJaWQgPSBJbnRlZ2VyLnBhcnNlSW50KGlkU3RyaW5nKTsKLQkJCVN0cmluZyBwYyA9IHN0cmluZ3NbMl07Ci0JCQlsaW5lTnVtYmVyID0gSW50ZWdlci5wYXJzZUludChwYyk7Ci0JCQlTdHJpbmcgc2FmZW5hbWUgPSBzdHJpbmdzWzNdOwotCi0JCQlpbnQgdGhlSW5kZXg7Ci0JCQl3aGlsZSAoKHRoZUluZGV4ID0gc2FmZW5hbWUuaW5kZXhPZigiJUBfUElQRV9AJSIpKSAhPSAtMSkKLQkJCXsKLQkJCQlzYWZlbmFtZSA9IHNhZmVuYW1lLnN1YnN0cmluZygwLCB0aGVJbmRleCkgKyAifCIgKyBzYWZlbmFtZS5zdWJzdHJpbmcodGhlSW5kZXggKyAiJUBfUElQRV9AJSIubGVuZ3RoKCksIHNhZmVuYW1lLmxlbmd0aCgpKTsKLQkJCX0KLQotCQkJbmFtZSA9IHAubGFzdFNlZ21lbnQoKSArICIgIiArIHNhZmVuYW1lOwotCQkJCi0JCQl2YXJpYWJsZXMgPSBuZXcgWFNMVmFyaWFibGVbc3RyaW5ncy5sZW5ndGgtNF07Ci0JCQlmb3IgKGludCBpPTA7aTx2YXJpYWJsZXMubGVuZ3RoO2krKykKLQkJCXsKLQkJCQlpbnQgdmFySWQgPSBJbnRlZ2VyLnBhcnNlSW50KHN0cmluZ3NbaSs0XSk7Ci0JCQkJdHJ5Ci0JCQkJewotCQkJCQlYU0xWYXJpYWJsZSB2YXIgPSBkZWJ1Z1RhcmdldC5nZXRWYXJpYWJsZSh2YXJJZCk7Ci0JCQkJCXZhcmlhYmxlc1tpXSA9IHZhcjsKLQkJCQl9Ci0JCQkJY2F0Y2ggKERlYnVnRXhjZXB0aW9uIGUpCi0JCQkJewotCQkJCQlMYXVuY2hpbmdQbHVnaW4ubG9nKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpCi0JCXsKLQkJCUxhdW5jaGluZ1BsdWdpbi5sb2coZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSVRocmVhZCBnZXRUaHJlYWQoKQotCXsKLQkJcmV0dXJuIHhzbFRocmVhZDsKLQl9Ci0KLQlwdWJsaWMgSVZhcmlhYmxlW10gZ2V0VmFyaWFibGVzKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uCi0JewotCQlyZXR1cm4gdmFyaWFibGVzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1ZhcmlhYmxlcygpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIHZhcmlhYmxlcy5sZW5ndGggPiAwOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIGxpbmVOdW1iZXI7Ci0JfQotCi0JcHVibGljIGludCBnZXRDaGFyU3RhcnQoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQl7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldENoYXJFbmQoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQl7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBuYW1lICsgIiBsaW5lOiAiICsgbGluZU51bWJlcjsKLQl9Ci0KLQlwdWJsaWMgSVJlZ2lzdGVyR3JvdXBbXSBnZXRSZWdpc3Rlckdyb3VwcygpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzUmVnaXN0ZXJHcm91cHMoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5TdGVwSW50bygpCi0JewotCQlyZXR1cm4gZ2V0VGhyZWFkKCkuY2FuU3RlcEludG8oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5TdGVwT3ZlcigpCi0JewotCQlyZXR1cm4gZ2V0VGhyZWFkKCkuY2FuU3RlcE92ZXIoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5TdGVwUmV0dXJuKCkKLQl7Ci0JCXJldHVybiBnZXRUaHJlYWQoKS5jYW5TdGVwUmV0dXJuKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTdGVwcGluZygpCi0JewotCQlyZXR1cm4gZ2V0VGhyZWFkKCkuaXNTdGVwcGluZygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0ZXBJbnRvKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uCi0JewotCQlnZXRUaHJlYWQoKS5zdGVwSW50bygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0ZXBPdmVyKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uCi0JewotCQlnZXRUaHJlYWQoKS5zdGVwT3ZlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0ZXBSZXR1cm4oKSB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQl7Ci0JCWdldFRocmVhZCgpLnN0ZXBSZXR1cm4oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5SZXN1bWUoKQotCXsKLQkJcmV0dXJuIGdldFRocmVhZCgpLmNhblJlc3VtZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhblN1c3BlbmQoKQotCXsKLQkJcmV0dXJuIGdldFRocmVhZCgpLmNhblN1c3BlbmQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1N1c3BlbmRlZCgpCi0JewotCQlyZXR1cm4gZ2V0VGhyZWFkKCkuaXNTdXNwZW5kZWQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXN1bWUoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQl7Ci0JCWdldFRocmVhZCgpLnJlc3VtZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN1c3BlbmQoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQl7Ci0JCWdldFRocmVhZCgpLnN1c3BlbmQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5UZXJtaW5hdGUoKQotCXsKLQkJcmV0dXJuIGdldFRocmVhZCgpLmNhblRlcm1pbmF0ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVGVybWluYXRlZCgpCi0JewotCQlyZXR1cm4gZ2V0VGhyZWFkKCkuaXNUZXJtaW5hdGVkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVybWluYXRlKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uCi0JewotCQlnZXRUaHJlYWQoKS50ZXJtaW5hdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSB0aGlzIHN0YWNrIGZyYW1lIGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNvdXJjZU5hbWUoKQotCXsKLQkJcmV0dXJuIHhzbEZpbGVOYW1lOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKQotCXsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFhTTFN0YWNrRnJhbWUpCi0JCXsKLQkJCVhTTFN0YWNrRnJhbWUgc2YgPSAoWFNMU3RhY2tGcmFtZSkgb2JqOwotCQkJcmV0dXJuIHNmLmlkID09IGlkOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkKLQl7Ci0JCXJldHVybiBnZXRTb3VyY2VOYW1lKCkuaGFzaENvZGUoKSArIGlkOwotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0SWRlbnRpZmllcigpCi0JewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGluZU51bWJlcihpbnQgbGluZU51bWJlcikKLQl7Ci0JCXRoaXMubGluZU51bWJlciA9IGxpbmVOdW1iZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFyaWFibGVzKElWYXJpYWJsZVtdIHZhcmlhYmxlcykKLQl7Ci0JCXRoaXMudmFyaWFibGVzID0gdmFyaWFibGVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL21vZGVsL1hTTFRocmVhZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvbW9kZWwvWFNMVGhyZWFkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNGQ4OTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvbW9kZWwvWFNMVGhyZWFkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSUJyZWFrcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JRGVidWdUYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3RhY2tGcmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklUaHJlYWQ7Ci0KLXB1YmxpYyBjbGFzcyBYU0xUaHJlYWQgZXh0ZW5kcyBYU0xEZWJ1Z0VsZW1lbnQgaW1wbGVtZW50cyBJVGhyZWFkCi17Ci0KLQkvKioKLQkgKiBCcmVha3BvaW50cyB0aGlzIHRocmVhZCBpcyBzdXNwZW5kZWQgYXQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KLQkgKi8KLQlwcml2YXRlIElCcmVha3BvaW50W10gZkJyZWFrcG9pbnRzOwotCi0JLyoqCi0JICogV2hldGhlciB0aGlzIHRocmVhZCBpcyBzdGVwcGluZwotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBmU3RlcHBpbmcgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgdGhyZWFkIGZvciB0aGUgZ2l2ZW4gdGFyZ2V0Ci0JICovCi0JcHVibGljIFhTTFRocmVhZChJRGVidWdUYXJnZXQgdGFyZ2V0KQotCXsKLQkJc3VwZXIodGFyZ2V0KTsKLQl9Ci0KLQlwdWJsaWMgSVN0YWNrRnJhbWVbXSBnZXRTdGFja0ZyYW1lcygpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCXsKLQkJaWYgKGlzU3VzcGVuZGVkKCkpCi0JCXsKLQkJCXJldHVybiAoKElYU0xEZWJ1Z1RhcmdldCkgZ2V0RGVidWdUYXJnZXQoKSkuZ2V0U3RhY2tGcmFtZXMoKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXJldHVybiBuZXcgSVN0YWNrRnJhbWVbMF07Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNTdGFja0ZyYW1lcygpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIGlzU3VzcGVuZGVkKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRQcmlvcml0eSgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIElTdGFja0ZyYW1lIGdldFRvcFN0YWNrRnJhbWUoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQl7Ci0JCUlTdGFja0ZyYW1lW10gZnJhbWVzID0gZ2V0U3RhY2tGcmFtZXMoKTsKLQkJaWYgKGZyYW1lcy5sZW5ndGggPiAwKQotCQl7Ci0JCQlyZXR1cm4gZnJhbWVzWzBdOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCXsKLQkJcmV0dXJuICJUaHJlYWRbMV0iOwotCX0KLQotCXB1YmxpYyBJQnJlYWtwb2ludFtdIGdldEJyZWFrcG9pbnRzKCkKLQl7Ci0JCWlmIChmQnJlYWtwb2ludHMgPT0gbnVsbCkKLQkJewotCQkJcmV0dXJuIG5ldyBJQnJlYWtwb2ludFswXTsKLQkJfQotCQlyZXR1cm4gZkJyZWFrcG9pbnRzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGJyZWFrcG9pbnRzIHRoaXMgdGhyZWFkIGlzIHN1c3BlbmRlZCBhdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBpZiBub25lLgotCSAqIAotCSAqIEBwYXJhbSBicmVha3BvaW50cwotCSAqICAgICAgICAgICAgdGhlIGJyZWFrcG9pbnRzIHRoaXMgdGhyZWFkIGlzIHN1c3BlbmRlZCBhdCwgb3IKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRCcmVha3BvaW50cyhJQnJlYWtwb2ludFtdIGJyZWFrcG9pbnRzKQotCXsKLQkJZkJyZWFrcG9pbnRzID0gYnJlYWtwb2ludHM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuUmVzdW1lKCkKLQl7Ci0JCXJldHVybiBpc1N1c3BlbmRlZCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhblN1c3BlbmQoKQotCXsKLQkJcmV0dXJuICFpc1N1c3BlbmRlZCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU3VzcGVuZGVkKCkKLQl7Ci0JCXJldHVybiBnZXREZWJ1Z1RhcmdldCgpLmlzU3VzcGVuZGVkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzdW1lKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uCi0JewotCQlnZXREZWJ1Z1RhcmdldCgpLnJlc3VtZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN1c3BlbmQoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQl7Ci0JCWdldERlYnVnVGFyZ2V0KCkuc3VzcGVuZCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhblN0ZXBJbnRvKCkKLQl7Ci0JCXJldHVybiBpc1N1c3BlbmRlZCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhblN0ZXBPdmVyKCkKLQl7Ci0JCXJldHVybiBpc1N1c3BlbmRlZCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhblN0ZXBSZXR1cm4oKQotCXsKLQkJcmV0dXJuIGlzU3VzcGVuZGVkKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTdGVwcGluZygpCi0JewotCQlyZXR1cm4gZlN0ZXBwaW5nOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0ZXBJbnRvKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uCi0JewotCQkoKElYU0xEZWJ1Z1RhcmdldCkgZ2V0RGVidWdUYXJnZXQoKSkuc3RlcEludG8oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGVwT3ZlcigpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCXsKLQkJKChJWFNMRGVidWdUYXJnZXQpIGdldERlYnVnVGFyZ2V0KCkpLnN0ZXBPdmVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RlcFJldHVybigpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCXsKLQkJKChJWFNMRGVidWdUYXJnZXQpIGdldERlYnVnVGFyZ2V0KCkpLnN0ZXBSZXR1cm4oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5UZXJtaW5hdGUoKQotCXsKLQkJcmV0dXJuICFpc1Rlcm1pbmF0ZWQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1Rlcm1pbmF0ZWQoKQotCXsKLQkJcmV0dXJuIGdldERlYnVnVGFyZ2V0KCkuaXNUZXJtaW5hdGVkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVybWluYXRlKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uCi0JewotCQlnZXREZWJ1Z1RhcmdldCgpLnRlcm1pbmF0ZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFN0ZXBwaW5nKGJvb2xlYW4gc3RlcHBpbmcpCi0JewotCQlmU3RlcHBpbmcgPSBzdGVwcGluZzsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9tb2RlbC9YU0xWYWx1ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvbW9kZWwvWFNMVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY2NGZkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9tb2RlbC9YU0xWYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSURlYnVnVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVZhcmlhYmxlOwotCi1wdWJsaWMgY2xhc3MgWFNMVmFsdWUgZXh0ZW5kcyBYU0xEZWJ1Z0VsZW1lbnQgaW1wbGVtZW50cyBJVmFsdWUKLXsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBmVmFsdWU7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdHlwZTsKLQotCXB1YmxpYyBYU0xWYWx1ZShJRGVidWdUYXJnZXQgdGFyZ2V0LCBTdHJpbmcgdHlwZSwgU3RyaW5nIHZhbHVlKQotCXsKLQkJc3VwZXIodGFyZ2V0KTsKLQkJdGhpcy50eXBlID0gdHlwZTsKLQkJZlZhbHVlID0gdmFsdWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRSZWZlcmVuY2VUeXBlTmFtZSgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZVN0cmluZygpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCXsKLQkJaWYgKCJzdHJpbmciLmVxdWFscyh0eXBlKSkKLQkJCXJldHVybiAiJyIrZlZhbHVlKyInIjsKLQkJcmV0dXJuIGZWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FsbG9jYXRlZCgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIElWYXJpYWJsZVtdIGdldFZhcmlhYmxlcygpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIG5ldyBJVmFyaWFibGVbMF07Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzVmFyaWFibGVzKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uCi0JewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvbW9kZWwvWFNMVmFyaWFibGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL21vZGVsL1hTTFZhcmlhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNmNjZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvbW9kZWwvWFNMVmFyaWFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklEZWJ1Z1RhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklWYXJpYWJsZTsKLQotcHVibGljIGNsYXNzIFhTTFZhcmlhYmxlIGV4dGVuZHMgWFNMRGVidWdFbGVtZW50IGltcGxlbWVudHMgSVZhcmlhYmxlCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQUxfU0NPUEUgPSAiTCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFVOTkVMX1NDT1BFID0gIlQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdMT0JBTF9TQ09QRSA9ICJHIjsKLQotCXByaXZhdGUgZmluYWwgaW50IGlkOwotCXByaXZhdGUgU3RyaW5nIGZOYW1lOwotCXByaXZhdGUgU3RyaW5nIHNjb3BlOwotCXByaXZhdGUgU3RyaW5nIHR5cGU7Ci0KLQlwdWJsaWMgWFNMVmFyaWFibGUoSURlYnVnVGFyZ2V0IHRhcmdldCwgaW50IGlkKQotCXsKLQkJc3VwZXIodGFyZ2V0KTsKLQkJdGhpcy5pZCA9IGlkOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0SWQoKQotCXsKLQkJcmV0dXJuIGlkOwotCX0KLQotCXB1YmxpYyBJVmFsdWUgZ2V0VmFsdWUoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQl7Ci0JCXJldHVybiAoKElYU0xEZWJ1Z1RhcmdldCkgZ2V0RGVidWdUYXJnZXQoKSkuZ2V0VmFyaWFibGVWYWx1ZSh0aGlzKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkKLQl7Ci0JCXRoaXMuZk5hbWUgPSBuYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIGZOYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlVHlwZU5hbWUoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQl7Ci0JCWlmIChHTE9CQUxfU0NPUEUuZXF1YWxzKHNjb3BlKSkKLQkJCXJldHVybiAiZ2xvYmFsIjsKLQkJcmV0dXJuICJsb2NhbCI7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzVmFsdWVDaGFuZ2VkKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uCi0JewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIGV4cHJlc3Npb24pIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCXsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShJVmFsdWUgdmFsdWUpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCXsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1ZhbHVlTW9kaWZpY2F0aW9uKCkKLQl7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB2ZXJpZnlWYWx1ZShTdHJpbmcgZXhwcmVzc2lvbikgdGhyb3dzIERlYnVnRXhjZXB0aW9uCi0JewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdmVyaWZ5VmFsdWUoSVZhbHVlIHZhbHVlKSB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U2NvcGUoU3RyaW5nIHNjb3BlKQotCXsKLQkJdGhpcy5zY29wZSA9IHNjb3BlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2NvcGUoKQotCXsKLQkJcmV0dXJuIHNjb3BlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5zYXhvbi8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnNheG9uLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMTVhMWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnNheG9uLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy1kZWJ1Z2dlciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnNheG9uLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnNheG9uLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODg0ZWVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5zYXhvbi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC54c2wuc2F4b248L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnNheG9uL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnNheG9uL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjUwMjU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5zYXhvbi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC54c2wuc2F4b247c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMC41LjAucXVhbGlmaWVyCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5zYXhvbi9TYXhvbkZlYXR1cmVzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuc2F4b24vU2F4b25GZWF0dXJlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmM0ODhlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5zYXhvbi9TYXhvbkZlYXR1cmVzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotQUxMT1dfRVhURVJOQUxfRlVOQ1RJT05TPWh0dHA6Ly9zYXhvbi5zZi5uZXQvZmVhdHVyZS9hbGxvdy1leHRlcm5hbC1mdW5jdGlvbnMKLUFMTE9XX0VYVEVSTkFMX0ZVTkNUSU9OUy5UWVBFPWJvb2xlYW4KLUFMTE9XX0VYVEVSTkFMX0ZVTkNUSU9OUy5ERVNDPXRydWUgaWYgdGhlIHN0eWxlc2hlZXQgYWxsb3dzIGV4dGVybmFsIGZ1bmN0aW9ucyB0byBiZSBjYWxsZWQuIERlZmF1bHQgaXMgdHJ1ZS4gVGhlIHNldHRpbmcgZmFsc2UgaXMgcmVjb21tZW5kZWQgaW4gYW4gZW52aXJvbm1lbnQgd2hlcmUgdW50cnVzdGVkIHN0eWxlc2hlZXRzIG1heSBiZSBleGVjdXRlZC4gU2V0dGluZyB0aGlzIHZhbHVlIHRvIGZhbHNlICBhbHNvIGRpc2FibGVzIHVzZXItZGVmaW5lZCBleHRlbnNpb24gZWxlbWVudHMsIHRvZ2V0aGVyIHdpdGggdGhlIHdyaXRpbmcgb2YgbXVsdGlwbGUgb3V0cHV0IGZpbGVzLCBhbGwgb2Ygd2hpY2ggY2Fycnkgc2ltaWxhciBzZWN1cml0eSByaXNrcy4KLQotVFJBQ0VfRVhURVJOQUxfRlVOQ1RJT05TPWh0dHA6Ly9zYXhvbi5zZi5uZXQvZmVhdHVyZS90cmFjZS1leHRlcm5hbC1mdW5jdGlvbnMKLVRSQUNFX0VYVEVSTkFMX0ZVTkNUSU9OUy5UWVBFPWJvb2xlYW4KLVRSQUNFX0VYVEVSTkFMX0ZVTkNUSU9OUy5ERVNDPXRydWUgaWYgdGhlIHRyYWNpbmcgb2YgY2FsbHMgdG8gZXh0ZXJuYWwgSmF2YSBtZXRob2RzIGlzIHJlcXVpcmVkLiBEZWZhdWx0IGlzIGZhbHNlLiBUaGlzIHN3aXRjaCBpcyB1c2VmdWwgd2hlbiBhbmFseXppbmcgd2h5IFNheG9uIGZhaWxzIHRvIGZpbmQgYSBKYXZhIG1ldGhvZCB0byBtYXRjaCBhbiBleHRlbnNpb24gZnVuY3Rpb24gY2FsbCBpbiB0aGUgc3R5bGVzaGVldCwgb3Igd2h5IGl0IGNob29zZXMgb25lIG1ldGhvZCBvdmVyIGFub3RoZXIgd2hlbiBzZXZlcmFsIGFyZSBhdmFpbGFibGUuIFRoZSB0cmFjZSBvdXRwdXQgaXMgc2VudCB0byBTeXN0ZW0uZXJyLgotCi1USU1JTkc9aHR0cDovL3NheG9uLnNmLm5ldC9mZWF0dXJlL3RpbWluZwotVElNSU5HLlRZUEU9Ym9vbGVhbgotVElNSU5HLkRFU0M9dHJ1ZSBpZiBiYXNpYyB0aW1pbmcgaW5mb3JtYXRpb24gaXMgdG8gYmUgb3V0cHV0IHRvIHRoZSBzdGFuZGFyZCBlcnJvciBvdXRwdXQgc3RyZWFtLgotCi1UUkVFX01PREVMPWh0dHA6Ly9zYXhvbi5zZi5uZXQvZmVhdHVyZS90cmVlTW9kZWwKLVRSRUVfTU9ERUwuVFlQRT1pbnQKLVRSRUVfTU9ERUwuREVTQz1CdWlsZGVyLlNUQU5EQVJEX1RSRUUgb3IgQnVpbGRlci5USU5ZX1RSRUUuIFNlbGVjdHMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFNheG9uIHRyZWUgbW9kZWwuIFRoZSBkZWZhdWx0IGlzIEJ1aWxkZXIuVElOWV9UUkVFLgotCi1UUkFDRV9MSVNURU5FUj1odHRwOi8vc2F4b24uc2YubmV0L2ZlYXR1cmUvdHJhY2VMaXN0ZW5lcgotVFJBQ0VfTElTVEVORVIuVFlQRT1vYmplY3QKLVRSQUNFX0xJU1RFTkVSLkRFU0M9YW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIG5ldC5zZi5zYXhvbi50cmFjZS5UcmFjZUxpc3RlbmVyLiBUaGlzIG9iamVjdCB3aWxsIGJlIG5vdGlmaWVkIG9mIHNpZ25pZmljYW50IGV2ZW50cyBvY2N1cnJpbmcgZHVyaW5nIHRoZSB0cmFuc2Zvcm1hdGlvbiwgZm9yIHRyYWNpbmcgb3IgZGVidWdnaW5nIHB1cnBvc2VzLgotCi1MSU5FX05VTUJFUklORz1odHRwOi8vc2F4b24uc2YubmV0L2ZlYXR1cmUvbGluZW51bWJlcmluZwotTElORV9OVU1CRVJJTkcuVFlQRT1ib29sZWFuCi1MSU5FX05VTUJFUklORy5ERVNDPWluZGljYXRlcyB3aGV0aGVyIGxpbmUgbnVtYmVycyBhcmUgdG8gYmUgbWFpbnRhaW5lZCBmb3IgdGhlIHNvdXJjZSBkb2N1bWVudC4gVGhpcyB3aWxsIG5vdCBiZSBwb3NzaWJsZSBpZiB0aGUgc291cmNlIGRvY3VtZW50IGlzIHN1cHBsaWVkIGFzIGEgRE9NLiBUaGUgbGluZSBudW1iZXJzIGFyZSBhY2Nlc3NpYmxlIHRocm91Z2ggdGhlIHRyYWNpbmcgaW50ZXJmYWNlLCBhbmQgYWxzbyB2aWEgdGhlIHNheG9uOmxpbmUtbnVtYmVyKCkgZXh0ZW5zaW9uIGZ1bmN0aW9uLgotCi1SRUNPVkVSWV9QT0xJQ1k9aHR0cDovL3NheG9uLnNmLm5ldC9mZWF0dXJlL3JlY292ZXJ5UG9saWN5Ci1SRUNPVkVSWV9QT0xJQ1kuVFlQRT1pbnQKLVJFQ09WRVJZX1BPTElDWS5ERVNDPUFuIEludGVnZXIuIEluZGljYXRlcyBob3cgZHluYW1pYyBlcnJvcnMgc2hvdWxkIGJlIGhhbmRsZWQuIE9uZSBvZiB0aGUgdmFsdWVzIChkZWZpbmVkIGFzIGNvbnN0YW50cyBpbiB0aGUgQ29udHJvbGxlciBjbGFzcykgUkVDT1ZFUl9TSUxFTlRMWSwgUkVDT1ZFUl9XSVRIX1dBUk5JTkdTLCBvciBET19OT1RfUkVDT1ZFUikuCi0KLU1FU1NBR0VfRU1JVFRFUl9DTEFTUz1odHRwOi8vc2F4b24uc2YubmV0L2ZlYXR1cmUvbWVzc2FnZUVtaXR0ZXJDbGFzcwotTUVTU0FHRV9FTUlUVEVSX0NMQVNTLlRZUEU9Y2xhc3MKLU1FU1NBR0VfRU1JVFRFUl9DTEFTUy5ERVNDPVRoZSBmdWxsIG5hbWUgb2YgYSBzYXhvbiBlbWl0dGVyIGNsYXNzLiB0aGF0IGltcGxlbWVudHMgdGhlIG5ldC5zZi5zYXhvbi5vdXRwdXQuRW1pdHRlciBpbnRlcmZhY2U7IHRoZSBjbGFzcyB3aWxsIGJlIHVzZWQgdG8gZm9ybWF0IHRoZSBvdXRwdXQgb2YgdGhlIHhzbDptZXNzYWdlIGluc3RydWN0aW9uLgotCi1TT1VSQ0VfUEFSU0VSX0NMQVNTPWh0dHA6Ly9zYXhvbi5zZi5uZXQvZmVhdHVyZS9zb3VyY2VQYXJzZXJDbGFzcwotU09VUkNFX1BBUlNFUl9DTEFTUy5UWVBFPWNsYXNzCi1TT1VSQ0VfUEFSU0VSX0NMQVNTLkRFU0M9VGhlIGZ1bGwgbmFtZSBvZiBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgb3JnLnhtbC5zYXguWE1MUmVhZGVyIGludGVyZmFjZTsgdGhlIGNsYXNzIHdpbGwgYmUgdXNlZCB0byBwYXJzZSBzb3VyY2UgZG9jdW1lbnRzICh0aGF0IGlzLCB0aGUgcHJpbmNpcGFsIHNvdXJjZSBkb2N1bWVudCBwbHVzIGFueSBzZWNvbmRhcnkgc291cmNlIGRvY3VtZW50cyByZWFkIHVzaW5nIHRoZSBkb2N1bWVudCgpIGZ1bmN0aW9uKQotCi1TVFlMRV9QQVJTRVJfQ0xBU1M9aHR0cDovL3NheG9uLnNmLm5ldC9mZWF0dXJlL3N0eWxlUGFyc2VyQ2xhc3MKLVNUWUxFX1BBUlNFUl9DTEFTUy5UWVBFPWNsYXNzCi1TVFlMRV9QQVJTRVJfQ0xBU1MuREVTQz1UaGUgZnVsbCBuYW1lIG9mIGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBvcmcueG1sLnNheC5YTUxSZWFkZXIgaW50ZXJmYWNlOyB0aGUgY2xhc3Mgd2lsbCBiZSB1c2VkIHRvIHBhcnNlIHN0eWxlc2hlZXQgZG9jdW1lbnRzICh0aGF0IGlzLCB0aGUgcHJpbmNpcGFsIHN0eWxlc2hlZXQgbW9kdWxlIHBsdXMgYW55IHNlY29uZGFyeSBzb3VyY2UgZG9jdW1lbnRzIHJlYWQgdXNpbmcgeHNsOmluY2x1ZGUgb3IgeHNsOmltcG9ydCkKLQotT1VUUFVUX1VSSV9SRVNPTFZFUj1odHRwOi8vc2F4b24uc2YubmV0L2ZlYXR1cmUvb3V0cHV0VVJJUmVzb2x2ZXIKLU9VVFBVVF9VUklfUkVTT0xWRVIuVFlQRT1vYmplY3QKLU9VVFBVVF9VUklfUkVTT0xWRVIuREVTQz1BbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgbmV0LnNmLnNheG9uLk91dHB1dFVSSVJlc29sdmVyOyB0aGlzIG9iamVjdCB3aWxsIGJlIHVzZWQgdG8gcmVzb2x2ZSBVUklzIG9mIHNlY29uZGFyeSByZXN1bHQgZG9jdW1lbnRzIHNwZWNpZmllZCBpbiB0aGUgaHJlZiBhdHRyaWJ1dGUgb2YgdGhlIHhzbDpyZXN1bHQtZG9jdW1lbnQgIGluc3RydWN0aW9uCi0KLURURF9WQUxJREFUSU9OPWh0dHA6Ly9zYXhvbi5zZi5uZXQvZmVhdHVyZS92YWxpZGF0aW9uCi1EVERfVkFMSURBVElPTi5UWVBFPWJvb2xlYW4KLURURF9WQUxJREFUSU9OLkRFU0M9SW5kaWNhdGVzIHdoZXRoZXIgdGhlIFhNTCBwYXJzZXIgc2hvdWxkIGJlIGFza2VkIHRvIHZhbGlkYXRlIHNvdXJjZSBkb2N1bWVudHMgYWdhaW5zdCB0aGVpciBEVEQuIFRoaXMgYXBwbGllcyB0byB0aGUgaW5pdGlhbCBzb3VyY2UgZG9jdW1lbnQgYW5kIGFueSBzb3VyY2UgZG9jdW1lbnRzIHJlYWQgdXNpbmcgdGhlIGRvY3VtZW50KCkgZnVuY3Rpb24sIHVubGVzcyBoYW5kbGVkIGJ5IGEgdXNlci13cml0dGVuIFVSSVJlc29sdmVyLgotCi1WQUxJREFUSU9OX1dBUk5JTkdTPWh0dHA6Ly9zYXhvbi5zZi5uZXQvZmVhdHVyZS92YWxpZGF0aW9uLXdhcm5pbmdzCi1WQUxJREFUSU9OX1dBUk5JTkdTLlRZUEU9Ym9vbGVhbgotVkFMSURBVElPTl9XQVJOSU5HUy5ERVNDPVRoaXMgZGV0ZXJtaW5lcyB3aGV0aGVyIHZhbGlkYXRpb24gZXJyb3JzIGluIHJlc3VsdCBkb2N1bWVudHMgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgZmF0YWwuIEJ5IGRlZmF1bHQgdGhleSBhcmUgZmF0YWw7IHdpdGggdGhpcyBvcHRpb24gc2V0LCB0aGV5IGFyZSB0cmVhdGVkIGFzIHdhcm5pbmdzLgotCi1TQ0hFTUFfVkFMSURBVElPTj1odHRwOi8vc2F4b24uc2YubmV0L2ZlYXR1cmUvc2NoZW1hLXZhbGlkYXRpb24KLVNDSEVNQV9WQUxJREFUSU9OLlRZUEU9Ym9vbGVhbgotU0NIRU1BX1ZBTElEQVRJT04uREVTQz1UaGlzIGRldGVybWluZXMgd2hldGhlciBzb3VyY2UgZG9jdW1lbnRzIHNob3VsZCBiZSBwYXJzZWQgd2l0aCBzY2hlbWEtdmFsaWRhdGlvbiBlbmFibGVkLgotCi1WRVJTSU9OX1dBUk5JTkc9aHR0cDovL3NheG9uLnNmLm5ldC9mZWF0dXJlL3ZlcnNpb24td2FybmluZwotVkVSU0lPTl9XQVJOSU5HLlRZUEU9Ym9vbGVhbgotVkVSU0lPTl9XQVJOSU5HLkRFU0M9VGhpcyBkZXRlcm1pbmVzIHdoZXRoZXIgYSB3YXJuaW5nIHNob3VsZCBiZSBvdXRwdXQgd2hlbiBydW5uaW5nIGFuIFhTTFQgMi4wIHByb2Nlc3NvciBhZ2FpbnN0IGFuIFhTTFQgMS4wIHN0eWxlc2hlZXQuIFRoZSBYU0xUIHNwZWNpZmljYXRpb24gcmVxdWlyZXMgdGhpcyB0byBiZSBkb25lIGJ5IGRlZmF1bHQuCi0KLU5BTUVfUE9PTD1odHRwOi8vc2F4b24uc2YubmV0L2ZlYXR1cmUvbmFtZVBvb2wKLU5BTUVfUE9PTC5UWVBFPW9iamVjdAotTkFNRV9QT09MLkRFU0M9QSBpbnN0YW5jZSBvZiBjbGFzcyBuZXQuc2Yuc2F4b24ub20uTmFtZVBvb2wuIEluZGljYXRlcyB0aGF0IHRoZSBzdXBwbGllZCBOYW1lUG9vbCBzaG91bGQgYmUgdXNlZCBhcyB0aGUgdGFyZ2V0IChydW4tdGltZSkgTmFtZVBvb2wgYnkgYWxsIHN0eWxlc2hlZXRzIGNvbXBpbGVkICh1c2luZyBuZXdUZW1wbGF0ZXMoKSkgYWZ0ZXIgdGhpcyBjYWxsIG9uIHNldEF0dHJpYnV0ZS4gTm9ybWFsbHkgYSBzaW5nbGUgc3lzdGVtLWFsbG9jYXRlZCBOYW1lUG9vbCBpcyB1c2VkIGZvciBhbGwgc3R5bGVzaGVldHMgY29tcGlsZWQgd2hpbGUgdGhlIEphdmEgVk0gcmVtYWlucyBsb2FkZWQ7IHRoaXMgYXR0cmlidXRlIGFsbG93cyB1c2VyIGNvbnRyb2wgb3ZlciB0aGUgYWxsb2NhdGlvbiBvZiBOYW1lUG9vbHMuIE5vdGUgdGhhdCBzb3VyY2UgdHJlZXMgdXNlZCBhcyBpbnB1dCB0byBhIHRyYW5zZm9ybWF0aW9uIG11c3QgYmUgYnVpbHQgdXNpbmcgdGhlIHNhbWUgTmFtZVBvb2wgdGhhdCBpcyB1c2VkIHdoZW4gdGhlIHN0eWxlc2hlZXQgaXMgY29tcGlsZWQ6IHRoaXMgd2lsbCBoYXBwZW4gYXV0b21hdGljYWxseSBpZiB0aGUgaW5wdXQgdG8gYSB0cmFuc2Zvcm1hdGlvbiBpcyBzdXBwbGllZCBhcyBhIFNBWFNvdXJjZSBvciBTdHJlYW1Tb3VyY2UgYnV0IGl0IGlzIHVuZGVyIHVzZXIgY29udHJvbCBpZiB5b3UgYnVpbGQgdGhlIHNvdXJjZSB0cmVlIHlvdXJzZWxmLgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnNheG9uL1NheG9uT3V0cHV0UHJvcGVydGllcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnNheG9uL1NheG9uT3V0cHV0UHJvcGVydGllcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTc5MDcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5zYXhvbi9TYXhvbk91dHB1dFByb3BlcnRpZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1JTkRFTlRfU1BBQ0VTPXtodHRwOi8vc2F4b24uc2YubmV0L31pbmRlbnQtc3BhY2VzCi1JTkRFTlRfU1BBQ0VTLkRFU0M9KGludGVnZXIgdmFsdWUpLkRlZmluZXMgdGhlIG51bWJlciBvZiBzcGFjZXMgdXNlZCBmb3IgaW5kZW50YXRpb24gb2Ygb3V0cHV0Ci0KLVVOREVDTEFSRV9OQU1FU1BBQ0VTPXtodHRwOi8vc2F4b24uc2YubmV0L311bmRlY2xhcmUtbmFtZXNwYWNlcwotVU5ERUNMQVJFX05BTUVTUEFDRVMuREVTQz1pbmNsdWRlLWNvbnRlbnQtdHlwZSA9ICJ5ZXMiIHwgIm5vIi4gVGhpcyBhdHRyaWJ1dGUgaXMgZGVmaW5lZCBpbiBYU0xUIDIuMC4gSW5kaWNhdGVzIFhNTCAxLjEgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucyBhcmUgdG8gYmUgb3V0cHV0LgotCi1DSEFSQUNURVJfUkVQUkVTRU5UQVRJT049e2h0dHA6Ly9zYXhvbi5zZi5uZXQvfWNoYXJhY3Rlci1yZXByZXNlbnRhdGlvbgotQ0hBUkFDVEVSX1JFUFJFU0VOVEFUSU9OLkRFU0M9KHJlcDFbO3JlcDJdKS4gSW5kaWNhdGVzIHRoZSBwcmVmZXJyZWQgd2F5IG9mIHJlcHJlc2VudGluZyBub24tQVNDSUkgY2hhcmFjdGVycyBpbiBIVE1MIGFuZCBYTUwgb3V0cHV0LiByZXAxIGlzIGZvciBjaGFyYWN0ZXJzIGluIHRoZSByYW5nZSAxMjgtMjU2LCByZXAyIGZvciB0aG9zZSBhYm92ZSAyNTYuCi0KLU5FWFRfSU5fQ0hBSU49e2h0dHA6Ly9zYXhvbi5zZi5uZXQvfW5leHQtaW4tY2hhaW4KLU5FWFRfSU5fQ0hBSU4uREVTQz0odXJpKS4gSW5kaWNhdGVzIHRoYXQgdGhlIG91dHB1dCBpcyB0byBiZSBwaXBlZCBpbnRvIGFub3RoZXIgWFNMVCBzdHlsZXNoZWV0IHRvIHBlcmZvcm0gYW5vdGhlciB0cmFuc2Zvcm1hdGlvbi4gVGhlIGF1eGlsaWFyeSBwcm9wZXJ0eSBORVhUX0lOX0NIQUlOX0JBU0VfVVJJIHJlY29yZHMgdGhlIGJhc2UgVVJJIG9mIHRoZSBzdHlsZXNoZWV0IGVsZW1lbnQgd2hlcmUgdGhpcyBhdHRyaWJ1dGUgd2FzIGZvdW5kLgotCi1UWVBFX0lORk9STUFUSU9OPXtodHRwOi8vc2F4b24uc2YubmV0L310eXBlLWluZm9ybWF0aW9uCi1UWVBFX0lORk9STUFUSU9OLkRFU0M9KG5vbmV8cHJlc2VydmV8c3RyaWN0fGxheCkuIEluZGljYXRlcyB0aGUgdmFsdWUgb2YgdGhlIHR5cGUtaW5mb3JtYXRpb24gYXR0cmlidXRlOiAibm9uZSIsICJwcmVzZXJ2ZSIsICJzdHJpY3QiLCAibGF4IgotCi1SRVFVSVJFX1dFTExfRk9STUVEPXtodHRwOi8vc2F4b24uc2YubmV0L31yZXF1aXJlLXdlbGwtZm9ybWVkCi1SRVFVSVJFX1dFTExfRk9STUVELkRFU0M9KHllc3xubykuIEluZGljYXRlcyB3aGV0aGVyIGEgdXNlci1zdXBwbGllZCBDb250ZW50SGFuZGxlciByZXF1aXJlcyB0aGUgc3RyZWFtIG9mIFNBWCBldmVudHMgdG8gYmUgd2VsbC1mb3JtZWQgKHRoYXQgaXMsIHRvIGhhdmUgYSBzaW5nbGUgZWxlbWVudCBub2RlIGFuZCBubyB0ZXh0IG5vZGVzIGFzIGNoaWxkcmVuIG9mIHRoZSByb290KS4gVGhlIGRlZmF1bHQgaXMgIm5vIi4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuc2F4b24vYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5zYXhvbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2RiMzZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5zYXhvbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuc2F4b24vYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5zYXhvbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjBhY2JlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5zYXhvbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy1kZWJ1Z2dlci8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgU2F4b25GZWF0dXJlcy5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIFNheG9uT3V0cHV0UHJvcGVydGllcy5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnNheG9uL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnNheG9uL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDc3OGM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5zYXhvbi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI1Byb3BlcnRpZXMgZmlsZSBmb3Igb3JnLmVjbGlwc2Uud3N0LnhzbC5zYXhvbgotQnVuZGxlLU5hbWUuMCA9IFNheG9uIFBsdWctaW4gKEluY3ViYXRpbmcpCi1wcm9jZXNzb3JUeXBlLmxhYmVsLjAgPSBTYXhvbgotQnVuZGxlLVZlbmRvci4wID0gRWNsaXBzZS5vcmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuc2F4b24vcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5zYXhvbi9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTgyYjFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5zYXhvbi9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcucHJvY2Vzc29yVHlwZSI+Ci0gICAgICA8cHJvY2Vzc29yVHlwZQotICAgICAgICAgICAgZmVhdHVyZVByb3BlcnRpZXM9IlNheG9uRmVhdHVyZXMucHJvcGVydGllcyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueHNsLnNheG9uLnByb2Nlc3NvclR5cGUiCi0gICAgICAgICAgICBsYWJlbD0iJXByb2Nlc3NvclR5cGUubGFiZWwuMCIKLSAgICAgICAgICAgIG91dHB1dFByb3BlcnRpZXM9IlNheG9uT3V0cHV0UHJvcGVydGllcy5wcm9wZXJ0aWVzIgotICAgICAgICAgICAgdHJhbnNmb3JtZXJGYWN0b3J5PSJuZXQuc2Yuc2F4b24uVHJhbnNmb3JtZXJGYWN0b3J5SW1wbCI+Ci0gICAgICA8L3Byb2Nlc3NvclR5cGU+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuc2F4b24vc3JjLWRlYnVnZ2VyL1JFQURNRS50eHQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuc2F4b24vc3JjLWRlYnVnZ2VyL1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNjNhNTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnNheG9uL3NyYy1kZWJ1Z2dlci9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotSnVzdCBhIHBsYWNlaG9sZGVyIHRvIGVuc3VyZSBzcmMgZm9sZGVyIGFwcGVhcnMuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2ludGVybmFsL3BlcnNwZWN0aXZlL1hNTFBlcnNwZWN0aXZlRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2ludGVybmFsL3BlcnNwZWN0aXZlL1hNTFBlcnNwZWN0aXZlRmFjdG9yeS5qYXZhCmluZGV4IDRmMDk0YzcuLjE1MGExMDMgMTAwNjQ0Ci0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9pbnRlcm5hbC9wZXJzcGVjdGl2ZS9YTUxQZXJzcGVjdGl2ZUZhY3RvcnkuamF2YQorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvaW50ZXJuYWwvcGVyc3BlY3RpdmUvWE1MUGVyc3BlY3RpdmVGYWN0b3J5LmphdmEKQEAgLTQ1LDcgKzQ1LDYgQEAKIAkJLy8gQWRkIE91dGxpbmUgdG8gdGhlIGJvdHRvbS1sZWZ0CiAJCUlGb2xkZXJMYXlvdXQgYm90dG9tTGVmdCA9IAogCQkJbGF5b3V0LmNyZWF0ZUZvbGRlcigiYm90dG9tLWxlZnQiLCBJUGFnZUxheW91dC5CT1RUT00sIChmbG9hdCkgMC41MCwgImxlZnQiKTsKLQkJYm90dG9tTGVmdC5hZGRWaWV3KCJvcmcuZWNsaXBzZS53c3QueG1sLnZpZXdzLlhQYXRoVmlldyIpOwogCQlib3R0b21MZWZ0LmFkZFZpZXcoIm9yZy5lY2xpcHNlLndzdC54bWwueHBhdGgudWkudmlld3MuWFBhdGhOYXZpZ2F0b3IiKTsKIAkJCiAJCUlGb2xkZXJMYXlvdXQgYm90dG9tID0gbGF5b3V0LmNyZWF0ZUZvbGRlcigiYm90dG9tIiwgSVBhZ2VMYXlvdXQuQk9UVE9NLCAoZmxvYXQpIDAuNzUsIGVkaXRvckFyZWEpOwpAQCAtNzIsNyArNzEsNyBAQAogICAgICAgICBsYXlvdXQuYWRkU2hvd1ZpZXdTaG9ydGN1dChJUGFnZUxheW91dC5JRF9PVVRMSU5FKTsKICAgICAgICAgbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoSVBhZ2VMYXlvdXQuSURfUFJPQkxFTV9WSUVXKTsKICAgICAgICAgbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoSUNvbnNvbGVDb25zdGFudHMuSURfQ09OU09MRV9WSUVXKTsKLSAgICAgICAgbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoIm9yZy5lY2xpcHNlLndzdC5jb21tb24uc25pcHBldHMuaW50ZXJuYWwudWkuU25pcHBldHNWaWV3Iik7CisgICAgICAgIGxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KCIgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5zbmlwcGV0cy5pbnRlcm5hbC51aS5TbmlwcGV0c1ZpZXciKTsKIAl9CiAJCiAJcHJpdmF0ZSB2b2lkIGFkZFNob3J0Q3V0UGVyc3BlY3RpdmUoSVBhZ2VMYXlvdXQgbGF5b3V0KSB7CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDcyMzA1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMtZGVidWdnZXIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYjc2YmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWphdmFDb21waWxlci54YWxhbi1kZWJ1Z2dlci5qYXIuYXJncwotYnVpbGQueG1sCi14YWxhbi1kZWJ1Z2dlci5qYXIKLXRlbXAuZm9sZGVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1OTQwNjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJhMTMwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVGh1IEphbiAwMyAyMjoyNDo1MCBFU1QgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBiYzM0Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI1N1biBEZWMgMTYgMDg6NDg6NTIgR01UIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZDg1NjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jRnJpIEphbiAwNCAwOTowNDo0MyBFU1QgMjAwOAotY29tcGlsZXJzLmluY29tcGF0aWJsZS1lbnZpcm9ubWVudD0xCi1jb21waWxlcnMucC5idWlsZD0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLm1pc3NpbmctYnVuZGxlLWNsYXNzcGF0aC1lbnRyaWVzPTAKLWNvbXBpbGVycy5wLm1pc3NpbmctcGFja2FnZXM9MgotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MQotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MQotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNmRlMWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC54c2wueGFsYW47c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMC41LjAucXVhbGlmaWVyCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC54c2wueGFsYW4uZGVidWdnZXIKLVJlcXVpcmUtQnVuZGxlOiBvcmcuYXBhY2hlLnhhbGFuO2J1bmRsZS12ZXJzaW9uPSIyLjcuMCIsCi0gb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmc7YnVuZGxlLXZlcnNpb249IjEuMS4xIiwKLSBvcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnO2J1bmRsZS12ZXJzaW9uPSIwLjUuMCIKLUJ1bmRsZS1DbGFzc1BhdGg6IHhhbGFuLWRlYnVnZ2VyLmphcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuL1hhbGFuRmVhdHVyZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi9YYWxhbkZlYXR1cmVzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNmRhN2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuL1hhbGFuRmVhdHVyZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1PUFRJTUlaRT1odHRwOi8vYXBhY2hlLm9yZy94YWxhbi9mZWF0dXJlcy9vcHRpbWl6ZQotT1BUSU1JWkUuVFlQRT1ib29sZWFuCi1PUFRJTUlaRS5ERVNDPU9wdGltaXplIHN0eWxlc2hlZXQgcHJvY2Vzc2luZy4gQnkgZGVmYXVsdCwgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIHRydWUuIFlvdSBtYXkgbmVlZCB0byBzZXQgaXQgdG8gZmFsc2UgZm9yIHRvb2xpbmcgYXBwbGljYXRpb25zLgotCi1JTkNSRU1FTlRBTD1odHRwOi8vYXBhY2hlLm9yZy94YWxhbi9mZWF0dXJlcy9pbmNyZW1lbnRhbAotSU5DUkVNRU5UQUwuVFlQRT1ib29sZWFuCi1JTkNSRU1FTlRBTC5ERVNDPVByb2R1Y2Ugb3V0cHV0IGluY3JlbWVudGFsbHksIHJhdGhlciB0aGFuIHdhaXRpbmcgdG8gZmluaXNoIHBhcnNpbmcgdGhlIGlucHV0IGJlZm9yZSBnZW5lcmF0aW5nIGFueSBvdXRwdXQuIEJ5IGRlZmF1bHQgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIGZhbHNlLiBZb3UgY2FuIHR1cm4gdGhpcyBhdHRyaWJ1dGUgb24gdG8gdHJhbnNmb3JtIGxhcmdlIGRvY3VtZW50cyB3aGVyZSB0aGUgc3R5bGVzaGVldCBzdHJ1Y3R1cmUgaXMgb3B0aW1pemVkIHRvIGV4ZWN1dGUgaW5kaXZpZHVhbCB0ZW1wbGF0ZXMgd2l0aG91dCBoYXZpbmcgdG8gcGFyc2UgdGhlIGVudGlyZSBkb2N1bWVudC4KLQotU09VUkNFX0xPQ0FUSU9OPWh0dHA6Ly9hcGFjaGUub3JnL3hhbGFuL2ZlYXR1cmVzL3NvdXJjZV9sb2NhdGlvbgotU09VUkNFX0xPQ0FUSU9OLlRZUEU9Ym9vbGVhbgotU09VUkNFX0xPQ0FUSU9OLkRFU0M9QnkgZGVmYXVsdCwgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIGZhbHNlLiBTZXR0aW5nIHRoaXMgYXR0cmlidXRlIHRvIHRydWUgaW52b2x2ZXMgYSBzdWJzdGFudGlhbCBpbmNyZWFzZSBpbiBzdG9yYWdlIGNvc3QgcGVyIHNvdXJjZSBkb2N1bWVudCBub2RlLiBJZiB5b3Ugd2FudCB0byB1c2UgdGhlIE5vZGVJbmZvIGV4dGVuc2lvbiBmdW5jdGlvbnMgKG9yIHNvbWUgb3RoZXIgbWVjaGFuaXNtKSB0byBwcm92aWRlIHRoaXMgaW5mb3JtYXRpb24gZHVyaW5nIGEgdHJhbnNmb3JtLCB5b3UgbXVzdCBzZXQgdGhlIGF0dHJpYnV0ZSB0byB0cnVlIGJlZm9yZSBnZW5lcmF0aW5nIHRoZSBUcmFuc2Zvcm1lciBhbmQgcHJvY2Vzc2luZyB0aGUgc3R5bGVzaGVldC4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vWGFsYW5PdXRwdXRQcm9wZXJ0aWVzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vWGFsYW5PdXRwdXRQcm9wZXJ0aWVzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NmQ0N2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuL1hhbGFuT3V0cHV0UHJvcGVydGllcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVNfS0VZX0lOREVOVF9BTU9VTlQ9e2h0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0fWluZGVudC1hbW91bnQKLVNfS0VZX0lOREVOVF9BTU9VTlQuREVTQz1UaGUgbnVtYmVyIG9mIHdoaXRlc3BhY2VzIHRvIGluZGVudCBieSwgaWYgaW5kZW50PSJ5ZXMiCi0KLVNfS0VZX0VOVElUSUVTPXtodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdH1lbnRpdGllcwotU19LRVlfRU5USVRJRVMuREVTQz1GaWxlIG5hbWUgb2YgZmlsZSB0aGF0IHNwZWNpZmllcyBjaGFyYWN0ZXIgdG8gZW50aXR5IHJlZmVyZW5jZSBtYXBwaW5ncy4KLQotU19VU0VfVVJMX0VTQ0FQSU5HPXtodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdH11c2UtdXJsLWVzY2FwaW5nCi1TX1VTRV9VUkxfRVNDQVBJTkcuREVTQz1Vc2UgYSB2YWx1ZSBvZiAieWVzIiBpZiB0aGUgaHJlZiB2YWx1ZXMgZm9yIEhUTUwgc2VyaWFsaXphdGlvbiBzaG91bGQgdXNlICV4eCBlc2NhcGluZwotCi1TX09NSVRfTUVUQV9UQUc9e2h0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0fW9taXQtbWV0YS10YWcKLVNfT01JVF9NRVRBX1RBRy5ERVNDPVVzZSBhIHZhbHVlIG9mICJ5ZXMiIGlmIHRoZSBNRVRBIHRhZyBzaG91bGQgYmUgb21pdHRlZCB3aGVyZSBpdCB3b3VsZCBvdGhlcndpc2UgYmUgc3VwcGxpZWQuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNkYjM2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc1Y2I0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIFhhbGFuT3V0cHV0UHJvcGVydGllcy5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIFhhbGFuRmVhdHVyZXMucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHhhbGFuLWRlYnVnZ2VyLmphcgotamFycy5jb21waWxlLm9yZGVyID0geGFsYW4tZGVidWdnZXIuamFyCi1zb3VyY2UueGFsYW4tZGVidWdnZXIuamFyID0gc3JjLWRlYnVnZ2VyLwotb3V0cHV0LnhhbGFuLWRlYnVnZ2VyLmphciA9IGJpbi8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZjYjgwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSNQcm9wZXJ0aWVzIGZpbGUgZm9yIG9yZy5lY2xpcHNlLndzdC54c2wueGFsYW4KLUJ1bmRsZS1OYW1lLjAgPSBYYWxhbiBQbHVnLWluIChJbmN1YmF0aW5nKQotcHJvY2Vzc29yVHlwZS5sYWJlbC4wID0gWGFsYW4KLXByb2Nlc3Nvci5sYWJlbC4wID0gWGFsYW4gMi41LjEKLXByb2Nlc3Nvci5sYWJlbC4xID0gWGFsYW4gMi43LjAKLUJ1bmRsZS1WZW5kb3IuMCA9IEVjbGlwc2Uub3JnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFhYzhiYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLnByb2Nlc3NvclR5cGUiPgotICAgICAgPHByb2Nlc3NvclR5cGUKLSAgICAgICAgICAgIGZlYXR1cmVQcm9wZXJ0aWVzPSJYYWxhbkZlYXR1cmVzLnByb3BlcnRpZXMiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi5wcm9jZXNzb3JUeXBlIgotICAgICAgICAgICAgbGFiZWw9IiVwcm9jZXNzb3JUeXBlLmxhYmVsLjAiCi0gICAgICAgICAgICBvdXRwdXRQcm9wZXJ0aWVzPSJYYWxhbk91dHB1dFByb3BlcnRpZXMucHJvcGVydGllcyIKLSAgICAgICAgICAgIHRyYW5zZm9ybWVyRmFjdG9yeT0ib3JnLmFwYWNoZS54YWxhbi5wcm9jZXNzb3IuVHJhbnNmb3JtZXJGYWN0b3J5SW1wbCI+Ci0gICAgICA8L3Byb2Nlc3NvclR5cGU+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5kZWJ1Z2dlciI+Ci0gICAgICA8ZGVidWdnZXIKLSAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi5kZWJ1Z2dlci5YYWxhbkRlYnVnZ2VyIgotICAgICAgICAgICAgY2xhc3NwYXRoPSJ4YWxhbi1kZWJ1Z2dlci5qYXIiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi5kZWJ1Z2dlciIKLSAgICAgICAgICAgIG5hbWU9IlhhbGFuIDIuNS4xIG9yIGdyZWF0ZXIiCi0gICAgICAgICAgICBwcm9jZXNzb3JUeXBlSWQ9Im9yZy5lY2xpcHNlLndzdC54c2wueGFsYW4ucHJvY2Vzc29yVHlwZSI+Ci0gICAgICA8L2RlYnVnZ2VyPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcucHJvY2Vzc29yIj4KLSAgICAgIDxwcm9jZXNzb3IKLSAgICAgICAgICAgIGNsYXNzcGF0aD0iJHtlY2xpcHNlX29yYml0Om9yZy5hcGFjaGUueGFsYW59IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLnhhbGFuLjJfN18wIgotICAgICAgICAgICAgbGFiZWw9IiVwcm9jZXNzb3IubGFiZWwuMSIKLSAgICAgICAgICAgIHByb2Nlc3NvclR5cGVJZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi5wcm9jZXNzb3JUeXBlIgotICAgICAgICAgICAgZGVidWdnZXJJZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi5kZWJ1Z2dlciIKLSAgICAgICAgICAgIHN1cHBvcnRzPSIxLjAiPgotICAgICAgPC9wcm9jZXNzb3I+Ci0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuL3NyYy1kZWJ1Z2dlci9vcmcvZWNsaXBzZS93c3QveHNsL3hhbGFuL2RlYnVnZ2VyL1hhbGFuRGVidWdnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi9zcmMtZGVidWdnZXIvb3JnL2VjbGlwc2Uvd3N0L3hzbC94YWxhbi9kZWJ1Z2dlci9YYWxhbkRlYnVnZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMDRkYjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuL3NyYy1kZWJ1Z2dlci9vcmcvZWNsaXBzZS93c3QveHNsL3hhbGFuL2RlYnVnZ2VyL1hhbGFuRGVidWdnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wueGFsYW4uZGVidWdnZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Ub29NYW55TGlzdGVuZXJzRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4ucHJvY2Vzc29yLlRyYW5zZm9ybWVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50cmFjZS5UcmFjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50cmFuc2Zvcm1lci5UcmFuc2Zvcm1lckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Z2dlci5BYnN0cmFjdERlYnVnZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuZGVidWdnZXIuVmFyaWFibGU7Ci0KLXB1YmxpYyBjbGFzcyBYYWxhbkRlYnVnZ2VyIGV4dGVuZHMgQWJzdHJhY3REZWJ1Z2dlcgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhYYWxhbkRlYnVnZ2VyLmNsYXNzKTsKLQlwcml2YXRlIFhhbGFuVHJhY2VMaXN0ZW5lciBjdXJyZW50VHJhY2VMaXN0ZW5lcjsKLQkKLQlwdWJsaWMgdm9pZCBzZXRUcmFuc2Zvcm1lckZhY3RvcnkoVHJhbnNmb3JtZXJGYWN0b3J5IGZhY3RvcnkpCi0JewotCQlUcmFuc2Zvcm1lckZhY3RvcnlJbXBsIHRmaSA9IChUcmFuc2Zvcm1lckZhY3RvcnlJbXBsKSBmYWN0b3J5OwotCQl0Zmkuc2V0QXR0cmlidXRlKFRyYW5zZm9ybWVyRmFjdG9yeUltcGwuRkVBVFVSRV9TT1VSQ0VfTE9DQVRJT04sIEJvb2xlYW4uVFJVRSk7Ci0JCXRmaS5zZXRBdHRyaWJ1dGUoVHJhbnNmb3JtZXJGYWN0b3J5SW1wbC5GRUFUVVJFX09QVElNSVpFLCBCb29sZWFuLkZBTFNFKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRUcmFuc2Zvcm1lcihUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciwgTWFwIGxvY2F0aW9ucykKLQl7Ci0JCVRyYW5zZm9ybWVySW1wbCB0cmFuc2Zvcm1lckltcGwgPSAoVHJhbnNmb3JtZXJJbXBsKSB0cmFuc2Zvcm1lcjsKLQkJVHJhY2VNYW5hZ2VyIHRyTWdyID0gdHJhbnNmb3JtZXJJbXBsLmdldFRyYWNlTWFuYWdlcigpOwotCQl0cnkKLQkJewotLy8JCQlYYWxhblByaW50VHJhY2VMaXN0ZW5lciBwcmludGVyID0gbmV3IFhhbGFuUHJpbnRUcmFjZUxpc3RlbmVyKG5ldyBQcmludFdyaXRlcihTeXN0ZW0uZXJyKSk7Ci0vLwkJCXByaW50ZXIubV90cmFjZUVsZW1lbnRzID0gdHJ1ZTsKLS8vCQkJcHJpbnRlci5tX3RyYWNlU2VsZWN0aW9uID0gdHJ1ZTsKLS8vCQkJcHJpbnRlci5tX3RyYWNlVGVtcGxhdGVzID0gdHJ1ZTsKLS8vCQkJdHJNZ3IuYWRkVHJhY2VMaXN0ZW5lcihwcmludGVyKTsKLQkJCQotCQkJWGFsYW5UcmFjZUxpc3RlbmVyIHRyYWNlTGlzdGVuZXIgPSBuZXcgWGFsYW5UcmFjZUxpc3RlbmVyKHRoaXMpOwotCQkJdHJNZ3IuYWRkVHJhY2VMaXN0ZW5lcih0cmFjZUxpc3RlbmVyKTsKLQkJfQotCQljYXRjaCAoVG9vTWFueUxpc3RlbmVyc0V4Y2VwdGlvbiBlKQotCQl7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCX0KLQotCXB1YmxpYyBWYXJpYWJsZSBnZXRWYXJpYWJsZShpbnQgaWQpCi0JewotCQlyZXR1cm4gY3VycmVudFRyYWNlTGlzdGVuZXIuZ2V0VmFyaWFibGUoaWQpOwotCX0KLQotCXZvaWQgc2V0Q3VycmVudFRyYWNlTGlzdGVuZXIoWGFsYW5UcmFjZUxpc3RlbmVyIGN1cnJlbnRUcmFjZUxpc3RlbmVyKQotCXsKLQkJbG9nLmRlYnVnKCJTZXR0aW5nIG5ldyBYYWxhblRyYWNlTGlzdGVuZXIiKTsKLQkJdGhpcy5jdXJyZW50VHJhY2VMaXN0ZW5lciA9IGN1cnJlbnRUcmFjZUxpc3RlbmVyOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi9zcmMtZGVidWdnZXIvb3JnL2VjbGlwc2Uvd3N0L3hzbC94YWxhbi9kZWJ1Z2dlci9YYWxhblByaW50VHJhY2VMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuL3NyYy1kZWJ1Z2dlci9vcmcvZWNsaXBzZS93c3QveHNsL3hhbGFuL2RlYnVnZ2VyL1hhbGFuUHJpbnRUcmFjZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNmMwN2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuL3NyYy1kZWJ1Z2dlci9vcmcvZWNsaXBzZS93c3QveHNsL3hhbGFuL2RlYnVnZ2VyL1hhbGFuUHJpbnRUcmFjZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi5kZWJ1Z2dlcjsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXMuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzLkVsZW1UZW1wbGF0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlcy5FbGVtVGV4dExpdGVyYWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50cmFjZS5FbmRTZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnRyYWNlLlByaW50VHJhY2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnRyYWNlLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udHJhY2UuVHJhY2VyRXZlbnQ7Ci0KLXB1YmxpYyBjbGFzcyBYYWxhblByaW50VHJhY2VMaXN0ZW5lciBleHRlbmRzIFByaW50VHJhY2VMaXN0ZW5lcgotewotCXByaXZhdGUgZmluYWwgUHJpbnRXcml0ZXIgd3JpdGVyOwotCi0JcHVibGljIFhhbGFuUHJpbnRUcmFjZUxpc3RlbmVyKFByaW50V3JpdGVyIHB3KQotCXsKLQkJc3VwZXIocHcpOwotCQl0aGlzLndyaXRlciA9IHB3OwotCX0KLQotCXB1YmxpYyB2b2lkIF90cmFjZShUcmFjZXJFdmVudCBldikKLQl7Ci0JCXN3aXRjaCAoZXYubV9zdHlsZU5vZGUuZ2V0WFNMVG9rZW4oKSkKLQkJewotCQkJY2FzZSBDb25zdGFudHMuRUxFTU5BTUVfVEVYVExJVEVSQUxSRVNVTFQ6Ci0JCQkJaWYgKG1fdHJhY2VFbGVtZW50cykKLQkJCQl7Ci0JCQkJCXdyaXRlci5wcmludChldi5tX3N0eWxlTm9kZS5nZXRTeXN0ZW1JZCgpICsgIiBMaW5lICMiICsgZXYubV9zdHlsZU5vZGUuZ2V0TGluZU51bWJlcigpICsgIiwgIiArICJDb2x1bW4gIyIgKyBldi5tX3N0eWxlTm9kZS5nZXRDb2x1bW5OdW1iZXIoKSArICIgLS0gIiArIGV2Lm1fc3R5bGVOb2RlLmdldE5vZGVOYW1lKCkKLQkJCQkJCQkrICI6ICIpOwotCi0JCQkJCUVsZW1UZXh0TGl0ZXJhbCBldGwgPSAoRWxlbVRleHRMaXRlcmFsKSBldi5tX3N0eWxlTm9kZTsKLQkJCQkJU3RyaW5nIGNoYXJzID0gbmV3IFN0cmluZyhldGwuZ2V0Q2hhcnMoKSwgMCwgZXRsLmdldENoYXJzKCkubGVuZ3RoKTsKLQotCQkJCQl3cml0ZXIucHJpbnRsbigiICAgICIgKyBjaGFycy50cmltKCkpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgQ29uc3RhbnRzLkVMRU1OQU1FX1RFTVBMQVRFOgotCQkJCWlmIChtX3RyYWNlVGVtcGxhdGVzIHx8IG1fdHJhY2VFbGVtZW50cykKLQkJCQl7Ci0JCQkJCUVsZW1UZW1wbGF0ZSBldCA9IChFbGVtVGVtcGxhdGUpIGV2Lm1fc3R5bGVOb2RlOwotCi0JCQkJCXdyaXRlci5wcmludChldC5nZXRTeXN0ZW1JZCgpICsgIiBMaW5lICMiICsgZXQuZ2V0TGluZU51bWJlcigpICsgIiwgIiArICJDb2x1bW4gIyIgKyBldC5nZXRDb2x1bW5OdW1iZXIoKSArICI6ICIgKyBldC5nZXROb2RlTmFtZSgpICsgIiAiKTsKLQotCQkJCQlpZiAobnVsbCAhPSBldC5nZXRNYXRjaCgpKQotCQkJCQl7Ci0JCQkJCQl3cml0ZXIucHJpbnQoIm1hdGNoPSciICsgZXQuZ2V0TWF0Y2goKS5nZXRQYXR0ZXJuU3RyaW5nKCkgKyAiJyAiKTsKLQkJCQkJfQotCi0JCQkJCWlmIChudWxsICE9IGV0LmdldE5hbWUoKSkKLQkJCQkJewotCQkJCQkJd3JpdGVyLnByaW50KCJuYW1lPSciICsgZXQuZ2V0TmFtZSgpICsgIicgIik7Ci0JCQkJCX0KLQotCQkJCQl3cml0ZXIucHJpbnRsbigpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJaWYgKG1fdHJhY2VFbGVtZW50cykKLQkJCQl7Ci0JCQkJCXdyaXRlcgotCQkJCQkJCS5wcmludGxuKGV2Lm1fc3R5bGVOb2RlLmdldFN5c3RlbUlkKCkgKyAiIExpbmUgIyIgKyBldi5tX3N0eWxlTm9kZS5nZXRMaW5lTnVtYmVyKCkgKyAiLCAiICsgIkNvbHVtbiAjIiArIGV2Lm1fc3R5bGVOb2RlLmdldENvbHVtbk51bWJlcigpICsgIjogIgotCQkJCQkJCQkJKyBldi5tX3N0eWxlTm9kZS5nZXROb2RlTmFtZSgpKTsKLQkJCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldikgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uCi0JewotCQl3cml0ZXIucHJpbnQoInNlbGVjdGVkOiAiKTsKLQkJc3VwZXIuc2VsZWN0ZWQoZXYpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZWxlY3RFbmQoRW5kU2VsZWN0aW9uRXZlbnQgZXYpIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgotCXsKLQkJd3JpdGVyLnByaW50KCJzZWxlY3RFbmQ6ICIpOwotCQlzdXBlci5zZWxlY3RFbmQoZXYpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0cmFjZShUcmFjZXJFdmVudCBldikKLQl7Ci0JCXdyaXRlci5wcmludCgidHJhY2U6ICIpOwotCQlzdXBlci50cmFjZShldik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRyYWNlRW5kKFRyYWNlckV2ZW50IGV2KQotCXsKLQkJd3JpdGVyLnByaW50KCJ0cmFjZUVuZDogIik7Ci0JCV90cmFjZShldik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuL3NyYy1kZWJ1Z2dlci9vcmcvZWNsaXBzZS93c3QveHNsL3hhbGFuL2RlYnVnZ2VyL1hhbGFuUm9vdFN0eWxlRnJhbWUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi9zcmMtZGVidWdnZXIvb3JnL2VjbGlwc2Uvd3N0L3hzbC94YWxhbi9kZWJ1Z2dlci9YYWxhblJvb3RTdHlsZUZyYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNDY0ZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuL3NyYy1kZWJ1Z2dlci9vcmcvZWNsaXBzZS93c3QveHNsL3hhbGFuL2RlYnVnZ2VyL1hhbGFuUm9vdFN0eWxlRnJhbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wueGFsYW4uZGVidWdnZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzLkVsZW1WYXJpYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlcy5TdHlsZXNoZWV0Um9vdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnRyYWNlLlRyYWNlckV2ZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueHBhdGguVmFyaWFibGVTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnZ2VyLlZhcmlhYmxlOwotCi1wdWJsaWMgY2xhc3MgWGFsYW5Sb290U3R5bGVGcmFtZSBleHRlbmRzIFhhbGFuU3R5bGVGcmFtZQotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhYYWxhblJvb3RTdHlsZUZyYW1lLmNsYXNzKTsKLQlwcml2YXRlIE1hcCB2YXJpYWJsZXM7Ci0JcHJpdmF0ZSBBcnJheUxpc3QgZ2xvYmFsczsKLQotCXB1YmxpYyBYYWxhblJvb3RTdHlsZUZyYW1lKFRyYWNlckV2ZW50IGV2ZW50KQotCXsKLQkJc3VwZXIobnVsbCwgZXZlbnQpOwotCQlmaWxsR2xvYmFscyhldmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0R2xvYmFscygpCi0JewotCQlyZXR1cm4gZ2xvYmFsczsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGZpbGxHbG9iYWxzKFRyYWNlckV2ZW50IGV2ZW50KQotCXsKLQkJVmFyaWFibGVTdGFjayB2cyA9IGV2ZW50Lm1fcHJvY2Vzc29yLmdldFhQYXRoQ29udGV4dCgpLmdldFZhclN0YWNrKCk7Ci0JICAgIFN0eWxlc2hlZXRSb290IHNyID0gZXZlbnQubV9zdHlsZU5vZGUuZ2V0U3R5bGVzaGVldFJvb3QoKTsKLQkgICAgVmVjdG9yIHZhcnMgPSBzci5nZXRWYXJpYWJsZXNBbmRQYXJhbXNDb21wb3NlZCgpOwotCQl2YXJpYWJsZXMgPSBuZXcgSGFzaE1hcCh2YXJzLnNpemUoKSk7Ci0JCWdsb2JhbHMgPSBuZXcgQXJyYXlMaXN0KHZhcnMuc2l6ZSgpKTsKLQkgICAgaW50IGkgPSB2YXJzLnNpemUoKTsKLQkgICAgd2hpbGUgKC0taSA+PSAwKQotCQl7Ci0JCQlFbGVtVmFyaWFibGUgdmFyaWFibGUgPSAoRWxlbVZhcmlhYmxlKSB2YXJzLmVsZW1lbnRBdChpKTsKLQkJCVhhbGFuVmFyaWFibGUgeHZhciA9IG5ldyBYYWxhblZhcmlhYmxlKHRoaXMsdnMsVmFyaWFibGUuR0xPQkFMX1NDT1BFLGksdmFyaWFibGUpOwotCQkJYWRkVmFyaWFibGUoeHZhcik7Ci0JCQlnbG9iYWxzLmFkZCh4dmFyKTsKLQkJfQotCX0KLQotCXB1YmxpYyBWYXJpYWJsZSBnZXRWYXJpYWJsZShpbnQgaWQpCi0JewotLy8JCWxvZy5kZWJ1ZygiR2V0dGluZyB2YXJpYWJsZSB3aXRoIGlkICIraWQrIiBmcm9tIHZhcmlhYmxlcyAiK3ZhcmlhYmxlcy5zaXplKCkpOwotCQlyZXR1cm4gKFZhcmlhYmxlKXZhcmlhYmxlcy5nZXQobmV3IEludGVnZXIoaWQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRWYXJpYWJsZShYYWxhblZhcmlhYmxlIHh2YXIpCi0JewotLy8JCWxvZy5kZWJ1ZygiQWRkaW5nIHZhcmlhYmxlIGluZGV4PSIreHZhci5nZXRTbG90TnVtYmVyKCkrIiB2YWw9Iit4dmFyKTsKLS8vCQl2YXJpYWJsZXMuYWRkKHh2YXIuZ2V0U2xvdE51bWJlcigpLHh2YXIpOwotCQlsb2cuZGVidWcoIkFkZGluZyB2YXJpYWJsZSBpZD0iK3h2YXIuZ2V0SWQoKSk7Ci0JCXZhcmlhYmxlcy5wdXQobmV3IEludGVnZXIoeHZhci5nZXRJZCgpKSx4dmFyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vc3JjLWRlYnVnZ2VyL29yZy9lY2xpcHNlL3dzdC94c2wveGFsYW4vZGVidWdnZXIvWGFsYW5TdHlsZUZyYW1lLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vc3JjLWRlYnVnZ2VyL29yZy9lY2xpcHNlL3dzdC94c2wveGFsYW4vZGVidWdnZXIvWGFsYW5TdHlsZUZyYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MWVhOTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuL3NyYy1kZWJ1Z2dlci9vcmcvZWNsaXBzZS93c3QveHNsL3hhbGFuL2RlYnVnZ2VyL1hhbGFuU3R5bGVGcmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wueGFsYW4uZGVidWdnZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlTG9jYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzLkVsZW1DYWxsVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXMuRWxlbVRlbXBsYXRlOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzLkVsZW1UZW1wbGF0ZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXMuRWxlbVZhcmlhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udHJhY2UuVHJhY2VyRXZlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLnJlZi5EVE1Ob2RlUHJveHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWwudXRpbHMuUU5hbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5WYXJpYWJsZVN0YWNrOwotaW1wb3J0IG9yZy5hcGFjaGUueHBhdGguWFBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Z2dlci5TdHlsZUZyYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuZGVidWdnZXIuVmFyaWFibGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIFhhbGFuU3R5bGVGcmFtZSBleHRlbmRzIFN0eWxlRnJhbWUKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coWGFsYW5TdHlsZUZyYW1lLmNsYXNzKTsKLQotCXByaXZhdGUgZmluYWwgTWFwIHZhck5hbWVzOwotCXByaXZhdGUgZmluYWwgU3RhY2sgZXZlbnRTdGFjayA9IG5ldyBTdGFjaygpOwotCWZpbmFsIFRyYWNlckV2ZW50IGV2ZW50OwotCXByaXZhdGUgaW50IGN1cnJlbnRMaW5lOwotCXByaXZhdGUgWGFsYW5Sb290U3R5bGVGcmFtZSByb290U3R5bGVGcmFtZTsKLQotCXB1YmxpYyBYYWxhblN0eWxlRnJhbWUoU3R5bGVGcmFtZSBwYXJlbnQsIFRyYWNlckV2ZW50IGV2ZW50KQotCXsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5ldmVudCA9IGV2ZW50OwotCQlpZiAocGFyZW50ICE9IG51bGwpCi0JCQl0aGlzLnZhck5hbWVzID0gbmV3IEhhc2hNYXAoKChYYWxhblN0eWxlRnJhbWUpIHBhcmVudCkudmFyTmFtZXMpOwotCQllbHNlCi0JCQl0aGlzLnZhck5hbWVzID0gbmV3IEhhc2hNYXAoKTsKLQkJcHVzaEVsZW1lbnQoZXZlbnQpOwotCQlmaW5kUm9vdFN0eWxlRnJhbWUoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmluZFJvb3RTdHlsZUZyYW1lKCkKLQl7Ci0JCVhhbGFuU3R5bGVGcmFtZSBmcmFtZSA9IHRoaXM7Ci0JCWRvCi0JCXsKLQkJCWlmIChmcmFtZSBpbnN0YW5jZW9mIFhhbGFuUm9vdFN0eWxlRnJhbWUpCi0JCQkJcm9vdFN0eWxlRnJhbWUgPSAoWGFsYW5Sb290U3R5bGVGcmFtZSkgZnJhbWU7Ci0JCX0KLQkJd2hpbGUgKChmcmFtZSA9IChYYWxhblN0eWxlRnJhbWUpIGZyYW1lLmdldFBhcmVudCgpKSAhPSBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVuYW1lKCkKLQl7Ci0JCXJldHVybiBldmVudC5tX3N0eWxlTm9kZS5nZXRTdHlsZXNoZWV0KCkuZ2V0U3lzdGVtSWQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkJU3RyaW5nIG5hbWUgPSBldmVudC5tX3N0eWxlTm9kZS5nZXROb2RlTmFtZSgpOwotCQlpZiAoZXZlbnQubV9zdHlsZU5vZGUgaW5zdGFuY2VvZiBFbGVtVGVtcGxhdGUpCi0JCXsKLQkJCUVsZW1UZW1wbGF0ZSBldCA9IChFbGVtVGVtcGxhdGUpIGV2ZW50Lm1fc3R5bGVOb2RlOwotCQkJUU5hbWUgcSA9IGV0LmdldE5hbWUoKTsKLQkJCWlmIChxICE9IG51bGwpCi0JCQl7Ci0JCQkJbmFtZSArPSAiIG5hbWU9XCIiICsgcS5nZXRMb2NhbE5hbWUoKSArICJcIiI7Ci0JCQl9Ci0JCQlYUGF0aCB4cCA9IGV0LmdldE1hdGNoKCk7Ci0JCQlpZiAoeHAgIT0gbnVsbCkKLQkJCXsKLQkJCQluYW1lICs9ICIgbWF0Y2g9XCIiICsgeHAuZ2V0UGF0dGVyblN0cmluZygpICsgIlwiIjsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChldmVudC5tX3N0eWxlTm9kZSBpbnN0YW5jZW9mIEVsZW1DYWxsVGVtcGxhdGUpCi0JCXsKLQkJCUVsZW1DYWxsVGVtcGxhdGUgZXQgPSAoRWxlbUNhbGxUZW1wbGF0ZSkgZXZlbnQubV9zdHlsZU5vZGU7Ci0JCQlRTmFtZSBxID0gZXQuZ2V0TmFtZSgpOwotCQkJaWYgKHEgIT0gbnVsbCkKLQkJCXsKLQkJCQluYW1lICs9ICIgbmFtZT1cIiIgKyBxLmdldExvY2FsTmFtZSgpICsgIlwiIjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRWYXJpYWJsZVN0YWNrKCkKLQl7Ci0JCUxpc3QgdmFycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdmFycy5hZGRBbGwoZ2V0TG9jYWxzKCkpOwotCQl2YXJzLmFkZEFsbChnZXRHbG9iYWxzKCkpOwotCQlyZXR1cm4gdmFyczsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEN1cnJlbnRMaW5lKCkKLQl7Ci0JCXJldHVybiBjdXJyZW50TGluZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwdXNoRWxlbWVudChUcmFjZXJFdmVudCBlKQotCXsKLQkJY3VycmVudExpbmUgPSBlLm1fc3R5bGVOb2RlLmdldExpbmVOdW1iZXIoKTsKLQkJZXZlbnRTdGFjay5wdXNoKGUpOwotCQlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCi0JCQlsb2cuZGVidWcoIlB1c2hlZCBlbGVtZW50ICIgKyBUcmFjZXJFdmVudC5wcmludE5vZGUoZS5tX3N0eWxlTm9kZSkgKyAiIGF0IGxpbmUgIiArIGN1cnJlbnRMaW5lKTsKLQl9Ci0KLQlwdWJsaWMgVHJhY2VyRXZlbnQgcG9wRWxlbWVudCgpCi0JewotCQlUcmFjZXJFdmVudCBlID0gKFRyYWNlckV2ZW50KSBldmVudFN0YWNrLnBvcCgpOwotCQljdXJyZW50TGluZSA9IGUubV9zdHlsZU5vZGUuZ2V0RW5kTGluZU51bWJlcigpOwotCQlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCi0JCQlsb2cuZGVidWcoIlBvcHBlZCBlbGVtZW50ICIgKyBUcmFjZXJFdmVudC5wcmludE5vZGUoZS5tX3N0eWxlTm9kZSkgKyAiIGF0IGxpbmUgIiArIGN1cnJlbnRMaW5lKTsKLQotCQlFbGVtVGVtcGxhdGVFbGVtZW50IGVsZW1lbnQgPSBlLm1fc3R5bGVOb2RlOwotCQlTdHJpbmcgbmFtZSA9IGVsZW1lbnQuZ2V0Tm9kZU5hbWUoKTsKLQkJbG9nLmRlYnVnKCIgbmFtZSAiICsgbmFtZSk7Ci0JCWlmIChuYW1lLmVxdWFscygicGFyYW0iKSB8fCBuYW1lLmVxdWFscygidmFyaWFibGUiKSkKLQkJCWFkZFZhcmlhYmxlKChFbGVtVmFyaWFibGUpIGUubV9zdHlsZU5vZGUpOwotCi0JCXJldHVybiBlOwotCX0KLQotCXB1YmxpYyBUcmFjZXJFdmVudCBwZWVrRWxlbWVudCgpCi0JewotCQlpZiAoZXZlbnRTdGFjay5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChUcmFjZXJFdmVudCkgZXZlbnRTdGFjay5wZWVrKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFZhcmlhYmxlKEVsZW1WYXJpYWJsZSB2YXJpYWJsZSkKLQl7Ci0JCVN0cmluZyBzY29wZSA9IHZhcmlhYmxlLmdldElzVG9wTGV2ZWwoKSA/IFZhcmlhYmxlLkdMT0JBTF9TQ09QRSA6IFZhcmlhYmxlLkxPQ0FMX1NDT1BFOwotCQlWYXJpYWJsZVN0YWNrIHZzID0gZXZlbnQubV9wcm9jZXNzb3IuZ2V0WFBhdGhDb250ZXh0KCkuZ2V0VmFyU3RhY2soKTsKLQkJWGFsYW5WYXJpYWJsZSB4dmFyID0gbmV3IFhhbGFuVmFyaWFibGUodGhpcywgdnMsIHNjb3BlLCB2YXJpYWJsZS5nZXRJbmRleCgpLCB2YXJpYWJsZSk7Ci0JCXJvb3RTdHlsZUZyYW1lLmFkZFZhcmlhYmxlKHh2YXIpOwotCQl2YXJOYW1lcy5wdXQodmFyaWFibGUuZ2V0TmFtZSgpLCB4dmFyKTsKLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0TG9jYWxzKCkKLQl7Ci0JCUxpc3QgbG9jYWxzID0gbmV3IEFycmF5TGlzdCh2YXJOYW1lcy52YWx1ZXMoKSk7Ci0JCS8vIHNvcnQgYnkgc2xvdE51bWJlcgotCQlDb2xsZWN0aW9ucy5zb3J0KGxvY2Fscyk7Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0KHZhck5hbWVzLnZhbHVlcygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRHbG9iYWxzKCkKLQl7Ci0JCXJldHVybiByb290U3R5bGVGcmFtZS5nZXRHbG9iYWxzKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTb3VyY2VGaWxlbmFtZSgpCi0JewotCQlTb3VyY2VMb2NhdG9yIGxvY2F0b3IgPSBnZXRTb3VyY2VMb2NhdG9yKCk7Ci0JCWlmIChsb2NhdG9yICE9IG51bGwpCi0JCQlyZXR1cm4gbG9jYXRvci5nZXRTeXN0ZW1JZCgpOwotCQlyZXR1cm4gIiI7Ci0JfQotCi0JcHVibGljIGludCBnZXRTb3VyY2VDdXJyZW50TGluZSgpCi0JewotCQlTb3VyY2VMb2NhdG9yIGxvY2F0b3IgPSBnZXRTb3VyY2VMb2NhdG9yKCk7Ci0JCWlmIChsb2NhdG9yICE9IG51bGwpCi0JCQlyZXR1cm4gbG9jYXRvci5nZXRMaW5lTnVtYmVyKCk7Ci0JCXJldHVybiAwOwotCX0KLQkKLQlwcml2YXRlIFNvdXJjZUxvY2F0b3IgZ2V0U291cmNlTG9jYXRvcigpCi0JewotCQlOb2RlIHNvdXJjZU5vZGUgPSBldmVudC5tX3NvdXJjZU5vZGU7Ci0gICAgICAgIFNvdXJjZUxvY2F0b3IgbG9jYXRvciA9IG51bGw7Ci0JCWlmIChzb3VyY2VOb2RlIGluc3RhbmNlb2YgRFRNTm9kZVByb3h5KQotCQl7Ci0JCQlpbnQgbm9kZUhhbmRsZXIgPSAoKERUTU5vZGVQcm94eSkgc291cmNlTm9kZSkuZ2V0RFRNTm9kZU51bWJlcigpOwotCQkJcmV0dXJuICgoRFRNTm9kZVByb3h5KSBzb3VyY2VOb2RlKS5nZXREVE0oKS5nZXRTb3VyY2VMb2NhdG9yRm9yKG5vZGVIYW5kbGVyKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vc3JjLWRlYnVnZ2VyL29yZy9lY2xpcHNlL3dzdC94c2wveGFsYW4vZGVidWdnZXIvWGFsYW5UcmFjZUxpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vc3JjLWRlYnVnZ2VyL29yZy9lY2xpcHNlL3dzdC94c2wveGFsYW4vZGVidWdnZXIvWGFsYW5UcmFjZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkM2E0NDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuL3NyYy1kZWJ1Z2dlci9vcmcvZWNsaXBzZS93c3QveHNsL3hhbGFuL2RlYnVnZ2VyL1hhbGFuVHJhY2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wueGFsYW4uZGVidWdnZXI7Ci0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXMuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udHJhY2UuRW5kU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50cmFjZS5FeHRlbnNpb25FdmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnRyYWNlLkdlbmVyYXRlRXZlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50cmFjZS5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnRyYWNlLlRyYWNlTGlzdGVuZXJFeDI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50cmFjZS5UcmFjZXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnZ2VyLkJyZWFrUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Z2dlci5WYXJpYWJsZTsKLQotcHVibGljIGNsYXNzIFhhbGFuVHJhY2VMaXN0ZW5lciBpbXBsZW1lbnRzIFRyYWNlTGlzdGVuZXJFeDIgLy9UcmFjZUxpc3RlbmVyRXgzCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFhhbGFuVHJhY2VMaXN0ZW5lci5jbGFzcyk7Ci0KLQlwcml2YXRlIGZpbmFsIFhhbGFuRGVidWdnZXIgZGVidWdnZXI7Ci0JcHJpdmF0ZSBYYWxhblJvb3RTdHlsZUZyYW1lIHJvb3RTdHlsZUZyYW1lOwotCQotCXB1YmxpYyBYYWxhblRyYWNlTGlzdGVuZXIoWGFsYW5EZWJ1Z2dlciBkZWJ1Z2dlcikKLQl7Ci0JCXRoaXMuZGVidWdnZXIgPSBkZWJ1Z2dlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0cmFjZShUcmFjZXJFdmVudCBldikKLQl7Ci0JCVhhbGFuU3R5bGVGcmFtZSBzdHlsZUZyYW1lID0gbnVsbDsKLQkJaWYgKHJvb3RTdHlsZUZyYW1lID09IG51bGwpCi0JCXsvLyB0aGlzIGlzIHRoZSByb290IG9mIHRoZSBzdGFjawotCQkJZGVidWdnZXIuZGVidWdnZXJUcmFuc2Zvcm1TdGFydGVkKCk7Ci0JCQlkZWJ1Z2dlci5zZXRDdXJyZW50VHJhY2VMaXN0ZW5lcih0aGlzKTsKLQkJCXJvb3RTdHlsZUZyYW1lID0gbmV3IFhhbGFuUm9vdFN0eWxlRnJhbWUoZXYpOwotCQkJc3R5bGVGcmFtZSA9IHJvb3RTdHlsZUZyYW1lOwotCQkJZGVidWdnZXIucHVzaFN0eWxlRnJhbWUoc3R5bGVGcmFtZSk7Ci0JCX0KLQkJZWxzZSBpZiAoZXYubV9zdHlsZU5vZGUuZ2V0T3duZXJYU0xUZW1wbGF0ZSgpID09IGV2Lm1fc3R5bGVOb2RlKQotCQl7Ly8gdGhpcyBpcyBhbiB4c2w6dGVtcGxhdGUsIHNvIGFkZCB0byB0ZW1wbGF0ZSBzdGFjawotCQkJc3R5bGVGcmFtZSA9IG5ldyBYYWxhblN0eWxlRnJhbWUoZGVidWdnZXIucGVla1N0eWxlRnJhbWUoKSwgZXYpOwotCQkJZGVidWdnZXIucHVzaFN0eWxlRnJhbWUoc3R5bGVGcmFtZSk7Ci0JCX0KLQkJZWxzZSBpZiAoZXYubV9zdHlsZU5vZGUuZ2V0WFNMVG9rZW4oKSAhPSBDb25zdGFudHMuRUxFTU5BTUVfVEVYVExJVEVSQUxSRVNVTFQpCi0JCXsvLyBhZGQgdG8gY3VycmVudCB0ZW1wbGF0ZSBlbGVtZW50IHN0YWNrCi0JCQlzdHlsZUZyYW1lID0gKFhhbGFuU3R5bGVGcmFtZSkgZGVidWdnZXIucGVla1N0eWxlRnJhbWUoKTsKLQkJCXN0eWxlRnJhbWUucHVzaEVsZW1lbnQoZXYpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJbG9nLmRlYnVnKCJTa2lwcGVkIHB1c2ggZm9yIGVsZW1lbnQgIitldi5tX3N0eWxlTm9kZS5nZXRMb2NhbE5hbWUoKSk7Ci0JCX0KLQkJY2hlY2soc3R5bGVGcmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdHJhY2VFbmQoVHJhY2VyRXZlbnQgZXYpCi0JewotCQlYYWxhblN0eWxlRnJhbWUgc3R5bGVGcmFtZSA9IChYYWxhblN0eWxlRnJhbWUpIGRlYnVnZ2VyLnBlZWtTdHlsZUZyYW1lKCk7Ci0JCWlmIChzdHlsZUZyYW1lIT1udWxsKQotCQl7Ci0JCQlpZiAoZXYubV9zdHlsZU5vZGUuZ2V0T3duZXJYU0xUZW1wbGF0ZSgpID09IGV2Lm1fc3R5bGVOb2RlKQotCQkJey8vIHJlbW92ZSBmcm9tIGN1cnJlbnQgdGVtcGxhdGUgZWxlbWVudCBzdGFjawotCQkJCXN0eWxlRnJhbWUucG9wRWxlbWVudCgpOwotCQkJfQotCQkJZWxzZSBpZiAoZXYubV9zdHlsZU5vZGUuZ2V0WFNMVG9rZW4oKSAhPSBDb25zdGFudHMuRUxFTU5BTUVfVEVYVExJVEVSQUxSRVNVTFQpCi0JCQl7Ly8gcmVtb3ZlIGZyb20gY3VycmVudCB0ZW1wbGF0ZSBlbGVtZW50IHN0YWNrCi0JCQkJc3R5bGVGcmFtZS5wb3BFbGVtZW50KCk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJbG9nLmRlYnVnKCJTa2lwcGVkIHBvcCBmb3IgZWxlbWVudCAiK2V2Lm1fc3R5bGVOb2RlLmdldExvY2FsTmFtZSgpKTsKLQkJCX0KLQkJCWNoZWNrKHN0eWxlRnJhbWUpOwotCQkJaWYgKGV2Lm1fc3R5bGVOb2RlLmdldE93bmVyWFNMVGVtcGxhdGUoKSA9PSBldi5tX3N0eWxlTm9kZSkKLQkJCXsvLyBlbmQgb2YgdGVtcGxhdGUsIHNvIHJlbW92ZSBmcm9tIHN0YWNrCi0JCQkJZGVidWdnZXIucG9wU3R5bGVGcmFtZSgpOwotCQkJfQotCQkJZWxzZQotCQkJey8vIGJlY2F1c2Ugd2UgZG9uJ3QgZ2V0IHNlbGVjdEVuZCBldmVudHMsIHdlIG5lZWQgdG8gZG8gdGhpcyBjaGVjawotCQkJCVRyYWNlckV2ZW50IHRlbCA9IHN0eWxlRnJhbWUucGVla0VsZW1lbnQoKTsKLQkJCQkvLyBpZiB0aGUgcGFyZW50IGlzIGEgY2hvb3NlLCBtb3ZlIG9uIHRvIGl0Ci0JCQkJc3dpdGNoICh0ZWwubV9zdHlsZU5vZGUuZ2V0WFNMVG9rZW4oKSkKLQkJCQl7Ci0JCQkJCWNhc2UgQ29uc3RhbnRzLkVMRU1OQU1FX0NIT09TRToKLQkJCQkJCXN0eWxlRnJhbWUucG9wRWxlbWVudCgpOwotCQkJCQkJY2hlY2soc3R5bGVGcmFtZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjaGVjayhYYWxhblN0eWxlRnJhbWUgc3R5bGVGcmFtZSkKLQl7Ci0JCWRlYnVnZ2VyLmNoZWNrU3RvcHBlZCgpOwotCQlpZiAoc3R5bGVGcmFtZSE9bnVsbCkKLQkJewotCQkJLy8gY2hlY2sgYnJlYWtwb2ludCBpbiBzdHlsZXNoZWV0Ci0JCQlCcmVha1BvaW50IGJyZWFrcG9pbnQgPSBuZXcgQnJlYWtQb2ludChzdHlsZUZyYW1lLmdldEZpbGVuYW1lKCksIHN0eWxlRnJhbWUuZ2V0Q3VycmVudExpbmUoKSk7Ci0JCQlkZWJ1Z2dlci5jaGVja1N1c3BlbmRlZChzdHlsZUZyYW1lLCBicmVha3BvaW50KTsKLQkJCS8vIFRPRE8gY2hlY2sgYnJlYWtwb2ludCBpbiBzb3VyY2UKLS8qCQkJYnJlYWtwb2ludCA9IG5ldyBCcmVha1BvaW50KHN0eWxlRnJhbWUuZ2V0U291cmNlRmlsZW5hbWUoKSwgc3R5bGVGcmFtZS5nZXRTb3VyY2VDdXJyZW50TGluZSgpKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tIiticmVha3BvaW50KTsKLQkJCWlmIChicmVha3BvaW50LmdldEZpbGUoKSAhPSBudWxsKQotCQkJCWRlYnVnZ2VyLmNoZWNrU3VzcGVuZGVkKHN0eWxlRnJhbWUsIGJyZWFrcG9pbnQpOwotKi8JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldikgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uCi0Je30KLQotCXB1YmxpYyB2b2lkIHNlbGVjdEVuZChFbmRTZWxlY3Rpb25FdmVudCBldikgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uCi0Je30KLQotCXB1YmxpYyB2b2lkIGdlbmVyYXRlZChHZW5lcmF0ZUV2ZW50IGV2KQotCXt9Ci0KLQlwdWJsaWMgdm9pZCBleHRlbnNpb24oRXh0ZW5zaW9uRXZlbnQgZWUpCi0Je30KLQotCXB1YmxpYyB2b2lkIGV4dGVuc2lvbkVuZChFeHRlbnNpb25FdmVudCBlZSkKLQl7fQotCi0JcHVibGljIFZhcmlhYmxlIGdldFZhcmlhYmxlKGludCBpZCkKLQl7Ci0JCXJldHVybiByb290U3R5bGVGcmFtZS5nZXRWYXJpYWJsZShpZCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vc3JjLWRlYnVnZ2VyL29yZy9lY2xpcHNlL3dzdC94c2wveGFsYW4vZGVidWdnZXIvWGFsYW5WYXJpYWJsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuL3NyYy1kZWJ1Z2dlci9vcmcvZWNsaXBzZS93c3QveHNsL3hhbGFuL2RlYnVnZ2VyL1hhbGFuVmFyaWFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM2N2VmYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vc3JjLWRlYnVnZ2VyL29yZy9lY2xpcHNlL3dzdC94c2wveGFsYW4vZGVidWdnZXIvWGFsYW5WYXJpYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wueGFsYW4uZGVidWdnZXI7Ci0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXMuRWxlbVZhcmlhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUueHBhdGguVmFyaWFibGVTdGFjazsKLWltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLm9iamVjdHMuWE5vZGVTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5vYmplY3RzLlhPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Z2dlci5WYXJpYWJsZTsKLQotcHVibGljIGNsYXNzIFhhbGFuVmFyaWFibGUgZXh0ZW5kcyBWYXJpYWJsZSBpbXBsZW1lbnRzIENvbXBhcmFibGUKLXsKLQlwcml2YXRlIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhYYWxhblZhcmlhYmxlLmNsYXNzKTsKLQlwcml2YXRlIGZpbmFsIEVsZW1WYXJpYWJsZSBlbGVtVmFyaWFibGU7Ci0JcHJpdmF0ZSBmaW5hbCBWYXJpYWJsZVN0YWNrIHZhclN0YWNrOwotCXByaXZhdGUgaW50IHN0YWNrRnJhbWU7Ci0KLQlwdWJsaWMgWGFsYW5WYXJpYWJsZShYYWxhblN0eWxlRnJhbWUgeGFsYW5TdHlsZUZyYW1lLCBWYXJpYWJsZVN0YWNrIHZhclN0YWNrLCBTdHJpbmcgc2NvcGUsIGludCBzbG90TnVtYmVyLCBFbGVtVmFyaWFibGUgZWxlbVZhcmlhYmxlKQotCXsKLQkJc3VwZXIoZ2V0TmFtZShlbGVtVmFyaWFibGUsc2NvcGUseGFsYW5TdHlsZUZyYW1lKSwgc2NvcGUsIHNsb3ROdW1iZXIrdmFyU3RhY2suZ2V0U3RhY2tGcmFtZSgpKTsKLQkJdGhpcy5lbGVtVmFyaWFibGUgPSBlbGVtVmFyaWFibGU7Ci0JCXRoaXMudmFyU3RhY2sgPSB2YXJTdGFjazsKLQkJLy8gZ2V0IHRoZSBzdGFjayBmcmFtZSBhdCB0aGlzIGN1cnJlbnQgcG9pbnQgaW4gdGltZQotCQl0aGlzLnN0YWNrRnJhbWUgPSB2YXJTdGFjay5nZXRTdGFja0ZyYW1lKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE5hbWUoRWxlbVZhcmlhYmxlIGVsZW1WYXJpYWJsZSwgU3RyaW5nIHNjb3BlLCBYYWxhblN0eWxlRnJhbWUgeGFsYW5TdHlsZUZyYW1lKQotCXsKLQkJU3RyaW5nIG5hbWUgPSBlbGVtVmFyaWFibGUuZ2V0TmFtZSgpLmdldExvY2FsTmFtZSgpOwotCQlTdHJpbmcgc3lzdGVtSWQgPSBlbGVtVmFyaWFibGUuZ2V0U3R5bGVzaGVldCgpLmdldFN5c3RlbUlkKCk7Ci0JCWlmIChHTE9CQUxfU0NPUEUuZXF1YWxzKHNjb3BlKSAmJiBzeXN0ZW1JZCAhPSBudWxsKQotCQl7Ci0JCQlpbnQgaW5kZXg7Ci0JCQlpZiAoKGluZGV4ID0gc3lzdGVtSWQubGFzdEluZGV4T2YoJy8nKSkgPiAwKQotCQkJCW5hbWUgKz0gIiAoIiArIHN5c3RlbUlkLnN1YnN0cmluZyhpbmRleCArIDEpICsgIikiOwotCQkJZWxzZQotCQkJCW5hbWUgKz0gIiAoIiArIHN5c3RlbUlkICsgIikiOwotCQl9Ci0vLwkJZWxzZSBpZiAoTE9DQUxfU0NPUEUuZXF1YWxzKHNjb3BlKSkKLS8vCQl7Ci0vLwkJCW5hbWUgKz0gIiAoIiArIHhhbGFuU3R5bGVGcmFtZS5nZXROYW1lKCkgKyAiKSI7Ci0vLwkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkKLQl7Ci0JCVN0cmluZyB2YWx1ZSA9IFVOS05PV047Ci0JCXRyeQotCQl7Ci0JCQlYT2JqZWN0IHhvYmplY3QgPSBnZXRYT2JqZWN0KCk7Ci0JCQlpZiAoeG9iamVjdCAhPSBudWxsKQotCQkJewotCQkJCWludCB4YWxhblR5cGUgPSB4b2JqZWN0LmdldFR5cGUoKTsKLQkJCQlzd2l0Y2ggKHhhbGFuVHlwZSkKLQkJCQl7Ci0JCQkJCWNhc2UgWE9iamVjdC5DTEFTU19VTlJFU09MVkVEVkFSSUFCTEU6Ci0JCQkJCQl2YWx1ZSA9IFVOUkVTT0xWRUQ7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBYT2JqZWN0LkNMQVNTX05PREVTRVQ6Ci0JCQkJCQl2YWx1ZSA9IE5PREVTRVQ7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBYT2JqZWN0LkNMQVNTX0JPT0xFQU46Ci0JCQkJCQl2YWx1ZSA9IEJPT0xFQU47Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBYT2JqZWN0LkNMQVNTX05VTUJFUjoKLQkJCQkJCXZhbHVlID0gTlVNQkVSOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgWE9iamVjdC5DTEFTU19VTktOT1dOOgotCQkJCQkJdmFsdWUgPSBVTktOT1dOOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgWE9iamVjdC5DTEFTU19TVFJJTkc6Ci0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQl2YWx1ZSA9IFNUUklORzsKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoVHJhbnNmb3JtZXJFeGNlcHRpb24gZSkKLQkJewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpCi0JewotCQlTdHJpbmcgdmFsdWUgPSAiPz8/IjsKLQkJdHJ5Ci0JCXsKLQkJCVhPYmplY3QgeG9iamVjdCA9IGdldFhPYmplY3QoKTsKLQkJCWlmICh4b2JqZWN0ICE9IG51bGwpCi0JCQl7Ci0JCQkJaW50IHhhbGFuVHlwZSA9IHhvYmplY3QuZ2V0VHlwZSgpOwotCQkJCXN3aXRjaCAoeGFsYW5UeXBlKQotCQkJCXsKLQkJCQkJY2FzZSBYT2JqZWN0LkNMQVNTX1VOUkVTT0xWRURWQVJJQUJMRToKLQkJCQkJCXZhbHVlID0gIiI7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBYT2JqZWN0LkNMQVNTX05PREVTRVQ6Ci0JCQkJCQlYTm9kZVNldCB4bnMgPSAoWE5vZGVTZXQpIHhvYmplY3Q7Ci0JCQkJCQlpZiAoeG5zLm5vZGVsaXN0KCkuZ2V0TGVuZ3RoKCkgPiAwKQotCQkJCQkJCXZhbHVlID0gKChYTm9kZVNldCkgeG9iamVjdCkubm9kZWxpc3QoKS5pdGVtKDApLnRvU3RyaW5nKCk7Ci0JCQkJCQllbHNlCi0JCQkJCQkJdmFsdWUgPSAiPEVNUFRZIE5PREVTRVQ+IjsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIFhPYmplY3QuQ0xBU1NfQk9PTEVBTjoKLQkJCQkJY2FzZSBYT2JqZWN0LkNMQVNTX05VTUJFUjoKLQkJCQkJY2FzZSBYT2JqZWN0LkNMQVNTX1NUUklORzoKLQkJCQkJY2FzZSBYT2JqZWN0LkNMQVNTX1VOS05PV046Ci0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQl2YWx1ZSA9IHhvYmplY3QudG9TdHJpbmcoKTsKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoVHJhbnNmb3JtZXJFeGNlcHRpb24gZSkKLQkJewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotLy8JCXZhbHVlID0gZ2V0U2NvcGUoKSsiLiIrZ2V0U2xvdE51bWJlcigpKyIpIitnZXROYW1lKCk7CQotLy8JCWxvZy5kZWJ1ZyhnZXRTY29wZSgpKyIuIitnZXRTbG90TnVtYmVyKCkrIikiK2dldE5hbWUoKSArICI9IiArIHZhbHVlKTsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCXByaXZhdGUgWE9iamVjdCBnZXRYT2JqZWN0KCkgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uCi0JewotCQlYT2JqZWN0IHh2YWx1ZTsKLQkJaWYgKGVsZW1WYXJpYWJsZS5nZXRJc1RvcExldmVsKCkpCi0JCQl4dmFsdWUgPSB2YXJTdGFjay5lbGVtZW50QXQoc2xvdE51bWJlcik7Ci0JCWVsc2UKLQkJCXh2YWx1ZSA9IHZhclN0YWNrLmdldExvY2FsVmFyaWFibGUoZWxlbVZhcmlhYmxlLmdldEluZGV4KCksIHN0YWNrRnJhbWUpOwotCQlyZXR1cm4geHZhbHVlOwotCX0KLQotCXB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBhcmcwKQotCXsKLQkJWGFsYW5WYXJpYWJsZSB4dmFyID0gKFhhbGFuVmFyaWFibGUpYXJnMDsKLQkJaW50IGNvbXAgPSB4dmFyLnN0YWNrRnJhbWUgLSBzdGFja0ZyYW1lOwotCQlpZiAoY29tcCA9PSAwKQotCQkJY29tcCA9IHNsb3ROdW1iZXIgLSB4dmFyLnNsb3ROdW1iZXI7Ci0JCXJldHVybiBjb21wOwotCX0KLX0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFlZTYxZC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLSAgICA8bmFtZT5vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmU8L25hbWU+Ci0gICAgPGNvbW1lbnQ+PC9jb21tZW50PgotICAgIDxwcm9qZWN0cz48L3Byb2plY3RzPgotICAgIDxidWlsZFNwZWM+Ci0gICAgICAgIDxidWlsZENvbW1hbmQ+Ci0gICAgICAgICAgICA8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0gICAgICAgICAgICA8YXJndW1lbnRzPjwvYXJndW1lbnRzPgotICAgICAgICA8L2J1aWxkQ29tbWFuZD4KLSAgICA8L2J1aWxkU3BlYz4KLSAgICA8bmF0dXJlcz4KLSAgICAgICAgPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotICAgIDwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NTBkZjEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1N1biBEZWMgMTYgMTY6NTc6NTcgRVNUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRkODU2OC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSNGcmkgSmFuIDA0IDA5OjA0OjQzIEVTVCAyMDA4Ci1jb21waWxlcnMuaW5jb21wYXRpYmxlLWVudmlyb25tZW50PTEKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAubWlzc2luZy1idW5kbGUtY2xhc3NwYXRoLWVudHJpZXM9MAotY29tcGlsZXJzLnAubWlzc2luZy1wYWNrYWdlcz0yCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0xCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0xCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxYjAyMTMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzBjZTdhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1YU0wgRmVhdHVyZSAoSW5jdWJhdGluZykKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1YU0xUIEVkaXRvciwgdmFsaWRhdG9yLCBsYXVuY2hpbmcgYW5kIGRlYnVnZ2luZyBzdXBwb3J0Ci0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUp1bmUgMDYsIDIwMDdcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi0gICAgLSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU0YTc4Yy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjAuNS4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzLyIvPgotICAgICAgPGRpc2NvdmVyeSBsYWJlbD0iV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFVwZGF0ZXMiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMiLz4KLSAgIDwvdXJsPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1ZyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwueHBhdGgudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuYXBhY2hlLnhhbGFuIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmFwYWNoZS5iY2VsIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0iamF2YV9jdXAucnVudGltZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjEuMS4xLnF1YWxpZmllciIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuZWRpdG9yLm91dGxpbmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDNlNjY1Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08SFRNTD48SEVBRD48VElUTEU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L1RJVExFPgotPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPE1FVEEgY29udGVudD0iTVNIVE1MIDYuMDAuMjgwMC4xNDc5IiBuYW1lPUdFTkVSQVRPUj48L0hFQUQ+Ci08Qk9EWSBsYW5nPUVOLVVTIHZMaW5rPXB1cnBsZSBsaW5rPWJsdWU+Ci08SDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9IMj4KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci08SDM+VXNhZ2UgT2YgQ29udGVudDwvSDM+Ci08UD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gCi1BTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRiAKLVRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgCi1CRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIAotQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIAotQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIAotQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgCi1NQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L1A+Ci08SDM+QXBwbGljYWJsZSBMaWNlbnNlczwvSDM+Ci08UD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgCi1Gb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgCi1QdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8QSAKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotPFA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgCi0oIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIAotYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L1A+Ci08UD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSAKLWNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIAotYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyAKLW5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi48L1A+Ci08UD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWQgCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCAKLUZlYXR1cmVzLjwvUD4KLTxQPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIAotaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgCi1GZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKLSgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IAotZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgCi1sb2NhdGlvbnM6PC9QPgotPFVMPgotICA8TEk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5IAotICA8TEk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXMgCi0gIDxMST5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnMgCi0gIDxMST5GZWF0dXJlIGRpcmVjdG9yaWVzIDwvTEk+PC9VTD4KLTxQPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCAKLXVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSAKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCAKLUZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gCi1sb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgCi1maWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgCi1VcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyAKLWFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgCi1kaXJlY3RvcnkuPC9QPgotPFA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgCi1PUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvUD4KLTxVTD4KLSAgPExJPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L0E+KQotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9BPikKLQotICA8TEk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L0E+KQotICA8TEk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvQT4pIAotICAKLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSA8L0xJPgotICAKLSAgPGxpPkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCI+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKTwvQT4KLSAgPC9MST4KLTwvVUw+Ci08UD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgCi1wcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L1A+Ci08SDM+Q3J5cHRvZ3JhcGh5PC9IMz4KLTxQPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSAKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIAotcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSAKLWVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIAotdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvUD48L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbF9zZGsuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2xfc2RrLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNTU0ZTQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbF9zZGsuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC54c2xfc2RrLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsX3Nkay5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2xfc2RrLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzUwZGYxLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2xfc2RrLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jU3VuIERlYyAxNiAxNjo1Nzo1NyBFU1QgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsX3Nkay5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsX3Nkay5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZDg1NjguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbF9zZGsuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI0ZyaSBKYW4gMDQgMDk6MDQ6NDMgRVNUIDIwMDgKLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MQotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5taXNzaW5nLWJ1bmRsZS1jbGFzc3BhdGgtZW50cmllcz0wCi1jb21waWxlcnMucC5taXNzaW5nLXBhY2thZ2VzPTIKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTEKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTEKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbF9zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbF9zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDNjYjc2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2xfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwotCi1nZW5lcmF0ZS5mZWF0dXJlQG9yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS5zb3VyY2U9b3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbF9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbF9zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsX3Nkay5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsX3Nkay5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2xfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGJiYjM3Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2xfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9WFNMIEZlYXR1cmUgU0RLIChJbmN1YmF0aW5nKQotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVhTTFQgRmVhdHVyZSBhcyBTREsKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbF9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2xfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxYWM3ZTQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbF9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2xfc2RrLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iRmVhdHVyZSBGZWF0dXJlIgotICAgICAgdmVyc2lvbj0iMC41LjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iRWNsaXBzZS5vcmciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzLyIvPgotICAgICAgPGRpc2NvdmVyeSBsYWJlbD0iV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFVwZGF0ZXMiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMiLz4KLSAgIDwvdXJsPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotICAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS5zb3VyY2UiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbF9zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsX3Nkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAzZTY2NS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsX3Nkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L0E+KQotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L0E+KQotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0gIAotICA8TEk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvQT4pIDwvTEk+Ci0gIAotICA8bGk+Q29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sIj5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpPC9BPgotICA8L0xJPgotPC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+Cg==