ZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0ZTg2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmVjNTZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotYnVpbGQueG1sCi1qYXZhQ29tcGlsZXIuLi5hcmdzCi1AZG90Ci1vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZV8xLjAuMTAyLjIwMDgwNDAyMDIwNC5qYXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzNkMmFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzU4NTU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAyNCAxMjo0MDo1MyBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NvbnN1bXB0aW9uL2NvcmUvbWVzc2FnZXMvQXhpczJDb25zdW1wdGlvblVJLnByb3BlcnRpZXM9SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNkNzVjYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLSNTdW4gTWF5IDA2IDE3OjMyOjM4IExLVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNmJlMTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVQTFVHSU5fTkFNRQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMTAyLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUucGx1Z2luLldlYlNlcnZpY2VBeGlzMkNvbnN1bXB0aW9uQ29yZVBsdWdpbgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLnVpLmlkZSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS5qZHQuY29yZSwKLSBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLAotIG9yZy5lY2xpcHNlLmpzdC53cywKLSBvcmcuZWNsaXBzZS5qc3Qud3MudWksCi0gb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLAotIG9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSwKLSBvcmcuZWNsaXBzZS53c3Qud3MsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aSwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUsCi0gb3JnLmVjbGlwc2Uud3N0LndzZGwsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQsCi0gb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLAotIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS5jb21tYW5kLAotIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLmRhdGEsCi0gb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUubWVzc2FnZXMsCi0gb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUucGx1Z2luLAotIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLnV0aWxzLAotIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLmRhdGEKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotQnVuZGxlLVZlbmRvcjogJVBMVUdJTl9QUk9WSURFUgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTczYmRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2E2MWZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IFdTTzIgSW5jIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgV1NPMiBJbmMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSMgLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgMjAwNzAxMzAgICAxNjg3NjIgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgSW5pdGlhbCBjb2RlIHRvIGludHJvZHVzZSB0aGUgCi0jCQkJCQkJCQkJCQlBeGlzMiBydW50aW1lIHRvIHRoZSBmcmFtZXdvcmsgZm9yIDE2ODc2MgotIyAyMDA3MDUwMiAgIDE4NDMwMiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBGaXggY29weXJpZ2h0IGZvciBBeGlzMiBwbHVnaW5zCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMzRjYTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IFdTTzIgSW5jLiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotIyAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyAyMDA3MDQyOCAgIDE2ODc2MiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbml0aWFsIGNvZGUgdG8gaW50cm9kdXNlIHRoZSAKLSMgCQkJCQkJCQkJCSBBeGlzMiBydW50aW1lIHRvIHRoZSBmcmFtZXdvcmsgZm9yIDE2ODc2MgotIyAyMDA3MDUwMSAgIDE4NDYxNyBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBQcm92aWRlIHBsdWdpbiBkZXRhaWxzCi0jIDIwMDcwNTA3ICAgMTg1Njg2IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIwotIyBNZXNzYWdlcyBpbiBwbHVnaW4ueG1sLgotIwotUExVR0lOX05BTUU9V2Vic2VydmljZSBBeGlzMiBDb25zdW1wdGlvbiBDb3JlIFBsdWctaW4KLVBMVUdJTl9QUk9WSURFUj1XU08yCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29uc3VtcHRpb24vY29yZS9jb21tYW5kL0F4aXMyQ2xpZW50Q29kZWdlbkNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb25zdW1wdGlvbi9jb3JlL2NvbW1hbmQvQXhpczJDbGllbnRDb2RlZ2VuQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGFhM2Y0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb25zdW1wdGlvbi9jb3JlL2NvbW1hbmQvQXhpczJDbGllbnRDb2RlZ2VuQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDIwNSAgIDE2ODc2MiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbml0aWFsIGNvZGUgdG8gaW50cm9kdXNlIHRoZSBBeGlzMiAKLSAqIAkJCQkJCQkJCQkgIHJ1bnRpbWUgdG8gdGhlIGZyYW1ld29yayBmb3IgMTY4NzYyCi0gKiAyMDA3MDIwNiAgIDE3MjE4NiBzYW5kYWtpdGhAd3NvMi5jb20JLSBGaXggZm9yIDE3MjE4NiwgQWRkZWQgYSBjaGVjayB0byBvdmVyY29tZSB0aGUgaXNzdWUuCi0gKiAyMDA3MDQyNiAgIDE4MzA0NiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoCi0gKiAyMDA3MDUwNyAgIDE4NTM5OCBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoCi0gKiAyMDA3MDgxMyAgIDE5NjE3MyAgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgRml4IDE5NjE3MywgRFdQIGN1c3RvbSBsb2NhdGlvbiBmaXgKLSAqIDIwMDcwODE0ICAgMTg3ODQwIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEZpeGluZyAxODc4NDAgSVRFIG1lc3NhZ2UKLSAqIDIwMDcwODE0ICAgMTkzNTkzIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIGN1c3RvbSBwYWNrYWdlIG5hbWUgZml4Ci0gKiAyMDA3MDgyNCAgIDIwMDUxNSBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBOT04tTkxTIG1vdmUgdG8gc2VwZXJhdGUgZmlsZQotICogMjAwODAyMTMgICAyMTg5MTAga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS5jb21tYW5kOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUuZGF0YS5EYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUubWVzc2FnZXMuQXhpczJDb25zdW1wdGlvblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUudXRpbHMuQ29udGVudENvcHlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS51dGlscy5XU0RMMkphdmFHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUudXRpbHMuV1NETFByb3BlcnR5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLmNvbnN0YW50LkF4aXMyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLnV0aWxzLkNsYXNzTG9hZGluZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUudXRpbHMuRmFjZXRDb250YWluZXJVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS51dGlscy5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JU3RhdHVzSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgQXhpczJDbGllbnRDb2RlZ2VuQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKLQkKLQkgIHByaXZhdGUgRGF0YU1vZGVsIG1vZGVsOwotCQkKLQkgIHB1YmxpYyBBeGlzMkNsaWVudENvZGVnZW5Db21tYW5kKCBEYXRhTW9kZWwgbW9kZWwgKXsKLQkgICAgdGhpcy5tb2RlbCA9IG1vZGVsOyAgCi0JICB9Ci0KLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQotCQkJCQkJCQkJCQkJCSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOyAgCi0JCUlFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9IGdldEVudmlyb25tZW50KCk7Ci0JCUlTdGF0dXNIYW5kbGVyIHN0YXR1c0hhbmRsZXIgPSBlbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCk7CQotCQkKLQkJU3RyaW5nIHdvcmtzcGFjZURpcmVjdG9yeSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuCi0JCQkJCQkJCQkJCQkJZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0JCVN0cmluZyBjdXJyZW50RHluYW1pY1dlYlByb2plY3REaXIgPSBGYWNldENvbnRhaW5lclV0aWxzLmdldFByb2plY3RSb290KAotCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5nZXRXZWJQcm9qZWN0TmFtZSgpKS50b09TU3RyaW5nKCk7Ci0JCVN0cmluZyBtYXRhZGF0YURpciA9IEZpbGVVdGlscy5hZGRBbm90aGVyTm9kZVRvUGF0aCgKLQkJCQkJCQkJCQl3b3Jrc3BhY2VEaXJlY3RvcnksCi0JCQkJCQkJCQkJQXhpczJDb25zdGFudHMuRElSX0RPVF9NRVRBREFUQSk7Ci0JICAgIFN0cmluZyBtYXRhZGF0YVBsdWdpbnNEaXIgPSBGaWxlVXRpbHMuYWRkQW5vdGhlck5vZGVUb1BhdGgoCi0JICAgIAkJCQkJCQkJbWF0YWRhdGFEaXIsCi0JICAgIAkJCQkJCQkJQXhpczJDb25zdGFudHMuRElSX0RPVF9QTFVHSU5TKTsKLQkgICAgU3RyaW5nIG1hdGFkYXRhQXhpczJEaXIgPSBGaWxlVXRpbHMuYWRkQW5vdGhlck5vZGVUb1BhdGgoCi0JICAgIAkJCQkJCQkJCW1hdGFkYXRhUGx1Z2luc0RpciwgCi0JICAgIAkJCQkJCQkJCUF4aXMyQ29uc3RhbnRzLkFYSVMyX1BST0pFQ1QpOwotCQlTdHJpbmcgdGVtcENvZGVnZW5PdXRwdXRMb2NhdGlvbiA9IEZpbGVVdGlscy5hZGRBbm90aGVyTm9kZVRvUGF0aCgKLQkJCQkJCQkJCQkJbWF0YWRhdGFBeGlzMkRpciwgCi0JCQkJCQkJCQkJCUF4aXMyQ29uc3RhbnRzLkNPREVHRU5fUkVTVUxUUyk7Ci0JCUZpbGUgdGVtcENvZGVnZW5PdXRwdXRMb2NhdGlvbkZpbGUgPSBuZXcgRmlsZSh0ZW1wQ29kZWdlbk91dHB1dExvY2F0aW9uKTsKLQkJaWYgKHRlbXBDb2RlZ2VuT3V0cHV0TG9jYXRpb25GaWxlLmV4aXN0cygpKXsKLQkJCUZpbGVVdGlscy5kZWxldGVEaXJlY3Rvcmllcyh0ZW1wQ29kZWdlbk91dHB1dExvY2F0aW9uKTsKLQkJfQotCQlGaWxlVXRpbHMuY3JlYXRlRGlyZWN0b3J5cyh0ZW1wQ29kZWdlbk91dHB1dExvY2F0aW9uKTsKLQkJV1NETDJKYXZhR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBXU0RMMkphdmFHZW5lcmF0b3IoKTsgCi0gICAgICAKLQkJLy9BeGlzU2VydmljZSBzZXJ2aWNlOwotCQlPYmplY3QgYXhpc1NlcnZpY2VJbnN0YW5jZTsKLQkJCi0JCVN0cmluZyB0cmFuc2Zvcm1lckZhY3RvcnkgPSBudWxsOwotCQlib29sZWFuIHRyYW5zZm9ybWVyRmFjdG9yeU1vZGlmaWVkID0gZmFsc2U7Ci0JCQotCXRyeSB7Ci0JCS8vIHVzZSB0aGUgeGFsYW4gdHJhbnNmb3JtZXIgZmFjdG9yeSBpZiBsb2FkYWJsZQotCQl0cnkgewotCQkJdHJhbnNmb3JtZXJGYWN0b3J5ID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeSIpOwotCQkJQ2xhc3MuZm9yTmFtZSgib3JnLmFwYWNoZS54YWxhbi5wcm9jZXNzb3IuVHJhbnNmb3JtZXJGYWN0b3J5SW1wbCIpOwotCQkJU3RyaW5nIG1vZGlmaWVkVHJhbnNmb3JtZXJGYWN0b3J5ID0gIm9yZy5hcGFjaGUueGFsYW4ucHJvY2Vzc29yLlRyYW5zZm9ybWVyRmFjdG9yeUltcGwiOwotCQkJaWYgKCFtb2RpZmllZFRyYW5zZm9ybWVyRmFjdG9yeS5lcXVhbHModHJhbnNmb3JtZXJGYWN0b3J5KSkgewotCQkJCVN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3RvcnkiLCBtb2RpZmllZFRyYW5zZm9ybWVyRmFjdG9yeSk7Ci0JCQkJdHJhbnNmb3JtZXJGYWN0b3J5TW9kaWZpZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCS8vIElmIGNsYXNzIG5vdCBmb3VuZCwga2VlcCB1c2luZyB0aGUgZGVmYXVsdCB0cmFuc2Zvcm1lciBmYWN0b3J5LgotCQl9Ci0JCQotCQkvL3NlcnZpY2UgPSBnZW5lcmF0b3IuZ2V0QXhpc1NlcnZpY2UobW9kZWwuZ2V0V3NkbFVSSSgpKTsKLQkJQ2xhc3NMb2FkaW5nVXRpbC5zZXRJbml0QnlDbGllbnQodHJ1ZSk7Ci0JCUNsYXNzTG9hZGluZ1V0aWwuY2xlYW5BbnRDbGFzc0xvYWRlcigpOwotCQlDbGFzc0xvYWRpbmdVdGlsLmluaXQobW9kZWwuZ2V0V2ViUHJvamVjdE5hbWUoKSk7Ci0JCWF4aXNTZXJ2aWNlSW5zdGFuY2UgPSBnZW5lcmF0b3IuZ2V0QXhpc1NlcnZpY2UobW9kZWwuZ2V0V3NkbFVSSSgpKTsKLQkJTWFwIG9wdGlvbnNNYXAgPSBnZW5lcmF0b3IuZmlsbE9wdGlvbk1hcCgJCi0JCQltb2RlbC5pc0FTeW5jKCksIC8vYXN5bmMKLSAgICAgICAgICAgIG1vZGVsLmlzU3luYygpLCAvL3N5bmMKLSAgICAgICAgICAgIGZhbHNlLCAgLy9zZXJ2aXJzaWRlIGZhbHNlIGFsd2F5cwotICAgICAgICAgICAgZmFsc2UsICAvL3NlcnZpY2VzLnhtbCBmYWxzZSBhbHdheXMKLSAgICAgICAgICAgIG1vZGVsLmlzVGVzdENhc2VDaGVjaygpLAotICAgICAgICAgICAgbW9kZWwuaXNHZW5lcmF0ZUFsbENoZWNrKCksCi0gICAgICAgICAgICAobW9kZWwuZ2V0U2VydmljZU5hbWUoKSE9bnVsbCk/bW9kZWwuZ2V0U2VydmljZU5hbWUoKTpudWxsLAotICAgICAgICAgICAgKG1vZGVsLmdldFBvcnROYW1lKCkhPW51bGwpP21vZGVsLmdldFBvcnROYW1lKCk6bnVsbCwKLSAgICAgICAgICAgIChtb2RlbC5nZXREYXRhYmluZGluZ1R5cGUoKS50b0xvd2VyQ2FzZSgpIT1udWxsKQotICAgICAgICAgICAgCQkJP21vZGVsLmdldERhdGFiaW5kaW5nVHlwZSgpLnRvTG93ZXJDYXNlKCkKLSAgICAgICAgICAgIAkJCTpudWxsLAotICAgICAgICAgICAgKG1vZGVsLmdldFdzZGxVUkkoKSE9bnVsbCk/bW9kZWwuZ2V0V3NkbFVSSSgpOm51bGwsCi0gICAgICAgICAgICAobW9kZWwuZ2V0UGFja2FnZVRleHQoKSE9bnVsbCk/bW9kZWwuZ2V0UGFja2FnZVRleHQoKTpudWxsLAotICAgICAgICAgICAgImphdmEiLAotICAgICAgICAgICAgdGVtcENvZGVnZW5PdXRwdXRMb2NhdGlvbiwKLSAgICAgICAgICAgIG1vZGVsLmdldE5hbWVzcGFzZVRvUGFja2FnZU1hcHBpbmcoKSwKLSAgICAgICAgICAgIGZhbHNlCS8vU2VydmVyc2lkZSBpbnRlcmZhY2UgYWx3YXlzIGZhbHNlCi0gICAgICAgICAgICk7IAotICAgICAgCi0gICAgICAgIC8vQ29kZUdlbkNvbmZpZ3VyYXRpb24gY29kZWdlbkNvbmZpZyA9IG5ldyBDb2RlR2VuQ29uZmlndXJhdGlvbihzZXJ2aWNlLCBvcHRpb25zTWFwKTsKLQkJQ2xhc3MgQ29kZUdlbkNvbmZpZ3VyYXRpb25DbGFzcyA9IENsYXNzTG9hZGluZ1V0aWwKLQkJCQkubG9hZENsYXNzRnJvbUFudENsYXNzTG9hZGVyKCJvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5Db2RlR2VuQ29uZmlndXJhdGlvbiIpOwotCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLwotCQkvL0ZpeCBmb3IgdGhlIEF4aXMyIDEuMiAKLQkJLy9Db25zdHJ1Y3RvciBDb2RlR2VuQ29uZmlndXJhdGlvbkNvbnN0cnVjdG9yID0gQ29kZUdlbkNvbmZpZ3VyYXRpb25DbGFzcwotCQkvLwkJLmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1tde2F4aXNTZXJ2aWNlSW5zdGFuY2UuZ2V0Q2xhc3MoKSxNYXAuY2xhc3N9KTsKLQkJLy9PYmplY3QgQ29kZUdlbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSA9IENvZGVHZW5Db25maWd1cmF0aW9uQ29uc3RydWN0b3IKLQkJLy8JCS5uZXdJbnN0YW5jZShuZXcgT2JqZWN0W117YXhpc1NlcnZpY2VJbnN0YW5jZSxvcHRpb25zTWFwfSk7Ci0JCQotCQlDb25zdHJ1Y3RvciBDb2RlR2VuQ29uZmlndXJhdGlvbkNvbnN0cnVjdG9yID0gQ29kZUdlbkNvbmZpZ3VyYXRpb25DbGFzcwotCQkJCS5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXXtNYXAuY2xhc3N9KTsKLQkJT2JqZWN0IENvZGVHZW5Db25maWd1cmF0aW9uSW5zdGFuY2UgPSBDb2RlR2VuQ29uZmlndXJhdGlvbkNvbnN0cnVjdG9yCi0JCQkJLm5ld0luc3RhbmNlKG5ldyBPYmplY3RbXXtvcHRpb25zTWFwfSk7Ci0JCQotCQkvLyBjb2RlZ2VuQ29uZmlnLmFkZEF4aXNTZXJ2aWNlKHNlcnZpY2UpOwotCQlNZXRob2QgYWRkQXhpc1NlcnZpY2VNZXRob2QgPSBDb2RlR2VuQ29uZmlndXJhdGlvbkNsYXNzCi0JCQkJLmdldE1ldGhvZCgiYWRkQXhpc1NlcnZpY2UiLCBuZXcgQ2xhc3NbXXsgYXhpc1NlcnZpY2VJbnN0YW5jZS5nZXRDbGFzcygpfSk7Ci0JCWFkZEF4aXNTZXJ2aWNlTWV0aG9kLmludm9rZShDb2RlR2VuQ29uZmlndXJhdGlvbkluc3RhbmNlLCAKLQkJCQkJCQluZXcgT2JqZWN0W117YXhpc1NlcnZpY2VJbnN0YW5jZX0pOwotCQkKLSAgICAgICAgLy9zZXQgdGhlIHdzZGwgZGVmaW5pc2lvbiBmb3IgY29kZWdlbiBjb25maWcgZm9yIHNrZWxldG9uIGdlbmVyYXJpb24uCi0gICAgICAgIFdTRExQcm9wZXJ0eVJlYWRlciByZWFkZXIgPSBuZXcgV1NETFByb3BlcnR5UmVhZGVyKCk7Ci0gICAgICAgIHJlYWRlci5yZWFkV1NETChtb2RlbC5nZXRXZWJQcm9qZWN0TmFtZSgpLG1vZGVsLmdldFdzZGxVUkkoKSk7Ci0gICAgICAgIE9iamVjdCB3c2RsRGVmaW5pdGlvbkluc3RhbmNlID0gcmVhZGVyLmdldFdzZGxEZWZpbml0aW9uSW5zdGFuY2UoKTsKLSAgICAgICAgLy9DbGFzcyBEZWZpbml0aW9uQ2xhc3MgPSBDbGFzc0xvYWRpbmdVdGlsLmxvYWRDbGFzc0Zyb21BbnRDbGFzc0xvYWRlcigiamF2YXgud3NkbC5EZWZpbml0aW9uIik7Ci0gICAgICAgIC8vY29kZWdlbkNvbmZpZy5zZXRXc2RsRGVmaW5pdGlvbih3c2RsRGVmaW5pdGlvbik7Ci0JCU1ldGhvZCBzZXRXc2RsRGVmaW5pdGlvbk1ldGhvZCA9IENvZGVHZW5Db25maWd1cmF0aW9uQ2xhc3MKLQkJCQkuZ2V0TWV0aG9kKCJzZXRXc2RsRGVmaW5pdGlvbiIsIG5ldyBDbGFzc1tde3JlYWRlci5nZXRXc2RsRGVmaW5pdGlvbkNsYXNzKCl9KTsKLQkJc2V0V3NkbERlZmluaXRpb25NZXRob2QuaW52b2tlKENvZGVHZW5Db25maWd1cmF0aW9uSW5zdGFuY2UsIAotCQkJCQluZXcgT2JqZWN0W117d3NkbERlZmluaXRpb25JbnN0YW5jZX0pOyAgICAgICAKLSAgICAgICAgCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLwotCQkKLSAgICAgICAgLy9zZXQgdGhlIGJhc2VVUkkKLSAgICAgICAgLy9jb2RlZ2VuQ29uZmlnLnNldEJhc2VVUkkoZ2VuZXJhdG9yLmdldEJhc2VVcmkobW9kZWwuZ2V0V3NkbFVSSSgpKSk7Ci0JCQotCQlNZXRob2Qgc2V0QmFzZVVSSU1ldGhvZCA9IENvZGVHZW5Db25maWd1cmF0aW9uQ2xhc3MKLQkJCQkuZ2V0TWV0aG9kKCJzZXRCYXNlVVJJIiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzfSk7Ci0JCXNldEJhc2VVUklNZXRob2QuaW52b2tlKENvZGVHZW5Db25maWd1cmF0aW9uSW5zdGFuY2UsIAotCQkJCQkJCQluZXcgT2JqZWN0W117Z2VuZXJhdG9yLmdldEJhc2VVcmkobW9kZWwuZ2V0V3NkbFVSSSgpKX0pOwotCQkKLQkJLy9HZXQgdGhlIG5hbWVzcGFjZSBmcm9tIHRoZSBBeGlzU2VydmljZSBhbmQgc2V0IGl0IGluIHRoZSBjb25maWd1cmF0aW9uIAotCQlDbGFzcyBBeGlzU2VydmljZUNsYXNzID0gQ2xhc3NMb2FkaW5nVXRpbAotCQkJCQkubG9hZENsYXNzRnJvbUFudENsYXNzTG9hZGVyKCJvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlIik7Ci0KLQkJTWV0aG9kIGdldFRhcmdldE5hbWVzcGFjZU1ldGhvZCA9IEF4aXNTZXJ2aWNlQ2xhc3MuZ2V0TWV0aG9kKCJnZXRUYXJnZXROYW1lc3BhY2UiLCBudWxsKTsKLQkJT2JqZWN0IHRhcmdldE5hbWVzcGFjZSA9IGdldFRhcmdldE5hbWVzcGFjZU1ldGhvZC5pbnZva2UoYXhpc1NlcnZpY2VJbnN0YW5jZSwgbnVsbCk7Ci0JCQotCQlPYmplY3Qgc3RyaW5nUmV0dXJuID0gbnVsbDsKLQkJaWYgKG1vZGVsLmdldFBhY2thZ2VUZXh0KCkhPW51bGwpIHsKLQkJCXN0cmluZ1JldHVybiA9IG1vZGVsLmdldFBhY2thZ2VUZXh0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlDbGFzcyBVUkxQcm9jZXNzb3JDbGFzcyA9IENsYXNzTG9hZGluZ1V0aWwKLQkJCQkJCS5sb2FkQ2xhc3NGcm9tQW50Q2xhc3NMb2FkZXIoIm9yZy5hcGFjaGUuYXhpczIudXRpbC5VUkxQcm9jZXNzb3IiKTsKLQkJCU1ldGhvZCBtYWtlUGFja2FnZU5hbWVNZXRob2QgPSBVUkxQcm9jZXNzb3JDbGFzcwotCQkJCQkJLmdldE1ldGhvZCgibWFrZVBhY2thZ2VOYW1lIiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzfSk7Ci0JCQlzdHJpbmdSZXR1cm4gPSBtYWtlUGFja2FnZU5hbWVNZXRob2QuaW52b2tlKG51bGwsIG5ldyBPYmplY3RbXXt0YXJnZXROYW1lc3BhY2V9KTsKLQkJfQotCi0JCQotCQltb2RlbC5zZXRQYWNrYWdlVGV4dChzdHJpbmdSZXR1cm4udG9TdHJpbmcoKSk7Ci0JCQotCQlNZXRob2Qgc2V0UGFja2FnZU5hbWVNZXRob2QgPSBDb2RlR2VuQ29uZmlndXJhdGlvbkNsYXNzCi0JCQkJCS5nZXRNZXRob2QoInNldFBhY2thZ2VOYW1lIiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzfSk7Ci0JCXNldFBhY2thZ2VOYW1lTWV0aG9kLmludm9rZShDb2RlR2VuQ29uZmlndXJhdGlvbkluc3RhbmNlLCBuZXcgT2JqZWN0W117c3RyaW5nUmV0dXJufSk7Ci0JCQotICAgICAgICAvL25ldyBDb2RlR2VuZXJhdGlvbkVuZ2luZShjb2RlZ2VuQ29uZmlnKS5nZW5lcmF0ZSgpOwotCQkKLQkJQ2xhc3MgQ29kZUdlbmVyYXRpb25FbmdpbmVDbGFzcyA9IENsYXNzTG9hZGluZ1V0aWwKLQkJCQkubG9hZENsYXNzRnJvbUFudENsYXNzTG9hZGVyKCJvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5Db2RlR2VuZXJhdGlvbkVuZ2luZSIpOwotCQlDb25zdHJ1Y3RvciBDb2RlR2VuZXJhdGlvbkVuZ2luZUNvbnN0cnVjdG9yID0gQ29kZUdlbmVyYXRpb25FbmdpbmVDbGFzcwotCQkJCQkuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW117Q29kZUdlbkNvbmZpZ3VyYXRpb25JbnN0YW5jZS5nZXRDbGFzcygpfSk7Ci0JCU9iamVjdCBDb2RlR2VuZXJhdGlvbkVuZ2luZUluc3RhbmNlICA9IENvZGVHZW5lcmF0aW9uRW5naW5lQ29uc3RydWN0b3IKLQkJCQkJLm5ld0luc3RhbmNlKG5ldyBPYmplY3RbXXtDb2RlR2VuQ29uZmlndXJhdGlvbkluc3RhbmNlfSk7Ci0JCQotCQkvL0ludm9rZSBDb2RlZ2VuIE1ldGhvZAotCQlNZXRob2QgZ2VuZXJhdGVNZXRob2QgPSBDb2RlR2VuZXJhdGlvbkVuZ2luZUNsYXNzLmdldE1ldGhvZCgiZ2VuZXJhdGUiLCBudWxsKTsKLQkJZ2VuZXJhdGVNZXRob2QuaW52b2tlKENvZGVHZW5lcmF0aW9uRW5naW5lSW5zdGFuY2UsIG51bGwpOwotICAgICAgCi0JCS8vQ29weSB0aGUgZXhpc3RpbmcgY29kZWdlbiByZXN1bHRzIHRvIHRoZSBjdXJyZW50IHByb2plY3QKLSAgICAgICAgQ29udGVudENvcHlVdGlscyBjb250ZW50Q29weVV0aWxzID0gbmV3IENvbnRlbnRDb3B5VXRpbHMoKTsKLQkgICAgc3RhdHVzID0gY29udGVudENvcHlVdGlscy5jb3B5RGlyZWN0b3J5UmVjdXJzaXZlbHlJbnRvV29ya3NwYWNlKAotCSAgICAJCQkJCQkJdGVtcENvZGVnZW5PdXRwdXRMb2NhdGlvbiwgCi0JICAgIAkJCQkJCQljdXJyZW50RHluYW1pY1dlYlByb2plY3REaXIsIAotCSAgICAJCQkJCQkJbW9uaXRvciwgCi0JICAgIAkJCQkJCQlzdGF0dXNIYW5kbGVyKTsKLSAgICAgIAotCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCXN0YXR1cyA9IFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKE5MUy5iaW5kKAotCQkJCQkJCQkJCQlBeGlzMkNvbnN1bXB0aW9uVUlNZXNzYWdlcy5FUlJPUl9DT0RFR0VOX0VYQ0VQVElPTiwKLQkJCQkJCQkJCQkJbmV3IFN0cmluZ1tdeyIgOiAiK2UuZ2V0Q2F1c2UoKX0pLAotCQkJCQkJCQkJCWUpOwotCQllbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsgCi0JfSBmaW5hbGx5IHsKLQkJaWYgKHRyYW5zZm9ybWVyRmFjdG9yeU1vZGlmaWVkKSB7Ci0JCQkvLyByZXN0b3JlIHRvIHRoZSBvcmlnaW5hbCBUcmFuc2Zvcm1lckZhY3RvcnkKLQkJCWlmICh0cmFuc2Zvcm1lckZhY3RvcnkgPT0gbnVsbCkgewotCQkJCVN5c3RlbS5jbGVhclByb3BlcnR5KCJqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeSIpOyAKLQkJCX0gZWxzZSB7Ci0JCQkJU3lzdGVtLnNldFByb3BlcnR5KCJqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeSIsIHRyYW5zZm9ybWVyRmFjdG9yeSk7IAotCQkJfQotCQl9Ci0JfQotCi0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29uc3VtcHRpb24vY29yZS9jb21tYW5kL0F4aXMyQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb25zdW1wdGlvbi9jb3JlL2NvbW1hbmQvQXhpczJDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTIzY2E1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb25zdW1wdGlvbi9jb3JlL2NvbW1hbmQvQXhpczJDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBXU08yIEluYy4sIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBXU08yIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzAyMDUgICAxNjg3NjIgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgSW5pdGlhbCBjb2RlIHRvIGludHJvZHVzZSB0aGUgQXhpczIgCi0gKiAJCQkJCQkJCQkJICBydW50aW1lIHRvIHRoZSBmcmFtZXdvcmsgZm9yIDE2ODc2MgotICogMjAwNzA0MjYgICAxODMwNDYgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aAotICogMjAwNzA1MDggICAxNzUwMzAgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgV1NETCBub3QgcGFzc2VkIHRvIEF4aXMyIGNsaWVudCBmaXgKLSAqIDIwMDcwNjEyICAgMTkyMDQ3IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIDE5MjA0NwotICogMjAwNzA2MTIgICAxOTIwNDcga2F0aHlAY2EuaWJtLmNvbSAgIC0gS2F0aHkgQ2hhbgotICogMjAwNzA4MjQgICAyMDA1MTUgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgTk9OLU5MUyBtb3ZlIHRvIHNlcGVyYXRlIGZpbGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS5kYXRhLkRhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS51dGlscy5EZWZhdWx0Q29kZWdlblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUuY29uc3RhbnQuQXhpczJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5JV2ViU2VydmljZUNsaWVudDsKLQotcHVibGljIGNsYXNzIEF4aXMyQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiB7Ci0JCi0JRGF0YU1vZGVsIG1vZGVsOwotCXByaXZhdGUgSVdlYlNlcnZpY2VDbGllbnQgd3M7Ci0JSVN0YXR1cyBzdGF0dXM7Ci0JCi0JcHVibGljIEF4aXMyQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQoRGF0YU1vZGVsIG1vZGVsLCBJV2ViU2VydmljZUNsaWVudCB3cyl7Ci0JCXRoaXMubW9kZWw9bW9kZWw7Ci0JCXRoaXMud3M9d3M7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykKLQkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkvL0RlZmF1bHQgU2V0dGluZ3MgZm9yIHRoZSBDb2RlZ2VuZXJhdGlvbgotCi0JCVN0cmluZyB3c2RsVVJMID0gd3MuZ2V0V2ViU2VydmljZUNsaWVudEluZm8oKS5nZXRXc2RsVVJMKCk7Ci0JCW1vZGVsLnNldFdzZGxVUkkod3NkbFVSTCk7Ci0JCQotCQltb2RlbC5zZXREYXRhYmluZGluZ1R5cGUoQXhpczJDb25zdGFudHMuREFUQV9CSU5ESU5HX0FEQik7Ci0JCW1vZGVsLnNldEFTeW5jKGZhbHNlKTsKLQkJbW9kZWwuc2V0U3luYyhmYWxzZSk7Ci0JCQotCQlEZWZhdWx0Q29kZWdlblV0aWwgZGVmYXVsdENvZGVnZW5VdGlsID0gbmV3IERlZmF1bHRDb2RlZ2VuVXRpbChtb2RlbCk7Ci0JCWRlZmF1bHRDb2RlZ2VuVXRpbC5wb3B1bGF0ZU1vZGVsUGFyYW1zRnJvbVdTREwoKTsKLQkJCi0JCXN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCQotCXB1YmxpYyBEYXRhTW9kZWwgZ2V0V2ViU2VydmljZURhdGFNb2RlbCgpewotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29uc3VtcHRpb24vY29yZS9jb21tYW5kL0F4aXMyQ2xpZW50VGVzdENhc2VJbnRlZ3JhdGVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29uc3VtcHRpb24vY29yZS9jb21tYW5kL0F4aXMyQ2xpZW50VGVzdENhc2VJbnRlZ3JhdGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NDEwYmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NvbnN1bXB0aW9uL2NvcmUvY29tbWFuZC9BeGlzMkNsaWVudFRlc3RDYXNlSW50ZWdyYXRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDUxOCAgICAgICAgMTg3MzExIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEZpeGluZyB0ZXN0IHJlc291cmNlIGFkZGl0aW9uCi0gKiAyMDA3MDYwOCAgICAgICAgMTkxMDU1IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIER1cGxpY2F0ZSBjbGFzc3BhdGggZW50cnkgZml4Ci0gKiAyMDA3MDgyNCAgICAgICAgMjAwNTE1IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIE5PTi1OTFMgbW92ZSB0byBzZXBhcmF0ZSBmaWxlCi0gKiAyMDA3MTEyMSAgICAgICAgMjA1MjI3IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIGpVbml0IHByb2JsZW0gd2l0aCBwcm9qZWN0IGV4cG9ydAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS5kYXRhLkRhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS5tZXNzYWdlcy5BeGlzMkNvbnN1bXB0aW9uVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS51dGlscy5Db250ZW50Q29weVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLmNvbnN0YW50LkF4aXMyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLnV0aWxzLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklTdGF0dXNIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmNvbW1vbi5CdW5kbGVVdGlsczsKLQotCi0vKioKLSAqIFRoaXMgQ2xhc3Mgd2lsbCBmaXJzdCBjaGVjayB3aGV0aGVyIEF4aXMyIENsaWVudCB3aWxsIGdlbmVyYXRlIHRoZSBUZXN0Q2FzZQotICogYW5kIGlmIHNvIHRoZW4gaXQgd2lsbCBpbnRlZ3JhdGUgdGhhdCB0ZXN0IHRvIHRoZSBpbml0aWF0ZWQgZHluYW1pYyB3ZWIgcHJvamVjdAotICoKLSAqLwotcHVibGljIGNsYXNzIEF4aXMyQ2xpZW50VGVzdENhc2VJbnRlZ3JhdGVDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gewotCi0gICAgcHJpdmF0ZSBEYXRhTW9kZWwgbW9kZWw7Ci0gICAgcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OwotICAgIHByaXZhdGUgYm9vbGVhbiB0ZXN0Q2xhc3NQYXRoRXhpc3RzOwotCi0gICAgcHVibGljIEF4aXMyQ2xpZW50VGVzdENhc2VJbnRlZ3JhdGVDb21tYW5kKElQcm9qZWN0IHByb2plY3RfLERhdGFNb2RlbCBtb2RlbF8pewotICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWxfOwotICAgICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0XzsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgU3RyaW5nIHdvcmtzcGFjZURpcmVjdG9yeSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0gICAgICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIHNlcnZpY2UgZ2VuZXJhdGUgdGVzdCBjYXNlIGlzIGVuYWJsZWQKLSAgICAgICAgaWYobW9kZWwuaXNUZXN0Q2FzZUNoZWNrKCkpewotICAgICAgICAJdHJ5ewotICAgICAgICAJLy8gVGhlbiBhZGQgdGhlIGxhdGVzdCBqdW5pdC5qYXIgZnJvbSB0byB0aGUgcHJvamVjdCBjbGFzcyBwYXRoCi0gICAgICAgIAlDb3B5SlVuaXRKYXJUb1Byb2plY3Qod29ya3NwYWNlRGlyZWN0b3J5LG1vbml0b3IpOwotCi0gICAgICAgICAgICAvLyBtYWtlIHRoZSB0ZXN0IGZvbGRlciBhcyBzb3VyY2UgZm9sZGVyLgotICAgICAgICAgICAgLy8gR2V0IHRoZSBQcm9qZWN0IEhhbmRsZXIKLSAgICAgICAgICAgIElKYXZhUHJvamVjdCBqYXZhUHJvaiA9IG5ldyBKYXZhUHJvamVjdChwcm9qZWN0LG51bGwpOwotICAgICAgICAgICAgLy8gdG8gZ2V0IGV4aXN0aW5nIGNsYXNzIHBhdGggZW50cmllcwotICAgICAgICAgICAgSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoRW50cmllcyA9IGphdmFQcm9qLmdldFJhd0NsYXNzcGF0aCgpOyAKLSAgICAgICAgICAgIC8vIGluY3JlYXNlIHRoZSBjbGFzcyBwYXRoIGVudHJpZXMgYXJyYXkgYnkgMSB0byBtYWtlIHJvb20gZm9yIHRoZSBuZXcgc291cmNlIGRpcmVjdG9yeQotICAgICAgICAgICAgLy8gd2hlcmUgcGF0aCBpcyB0aGUgbmV3IHNvdXJjZSBkaXJlY3RvcnkKLSAgICAgICAgICAgIElDbGFzc3BhdGhFbnRyeSBuZXdDbGFzc3BhdGhFbnRyeSA9IEphdmFDb3JlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5uZXdTb3VyY2VFbnRyeShnZXRQYXRoVG9UZXN0Rm9sZGVyKHByb2plY3Qsd29ya3NwYWNlRGlyZWN0b3J5KSk7IAotICAgICAgICAgICAKLSAgICAgICAgICAgIC8vQ2hlY2sgdGVzdCBkaXJlY3RvcnkgYWxyZWFkeSBpbiB0aGUgY2xhc3NwYXRoIGVudHJpZXMuCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzcGF0aEVudHJpZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoY2xhc3NwYXRoRW50cmllc1tpXS5lcXVhbHMobmV3Q2xhc3NwYXRoRW50cnkpKXsKLSAgICAgICAgICAgICAgICAJdGVzdENsYXNzUGF0aEV4aXN0cyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpbnQgY2xhc3NQYXRoTGVuZ3RoID0gY2xhc3NwYXRoRW50cmllcy5sZW5ndGg7Ci0gICAgICAgICAgICBpZighdGVzdENsYXNzUGF0aEV4aXN0cyl7Ci0gICAgICAgICAgICAJY2xhc3NQYXRoTGVuZ3RoKz0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgSUNsYXNzcGF0aEVudHJ5W10gbmV3Q2xhc3NwYXRoRW50cnlBcnJheSA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbY2xhc3NQYXRoTGVuZ3RoXTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc3BhdGhFbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAJIG5ld0NsYXNzcGF0aEVudHJ5QXJyYXlbaV09IGNsYXNzcGF0aEVudHJpZXNbaV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBpZiBub3QgYWxyZWFkeSBleGlzdCBhZGQgbmV3IENsYXNzIFBhdGggRW50cnkgdGVzdCBkaXJlY3RvcnkKLSAgICAgICAgICAgCWlmKCF0ZXN0Q2xhc3NQYXRoRXhpc3RzKXsKLSAgICAgICAgICAgIAluZXdDbGFzc3BhdGhFbnRyeUFycmF5W2NsYXNzUGF0aExlbmd0aC0xXSA9IG5ld0NsYXNzcGF0aEVudHJ5OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgamF2YVByb2ouc2V0UmF3Q2xhc3NwYXRoKG5ld0NsYXNzcGF0aEVudHJ5QXJyYXksbW9uaXRvcik7Ci0gICAgICAgICAgIAotICAgICAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIAkgdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgIAotICAgIH0KLSAgIAotICAgIC8qKgotICAgICAqIENvcHkgdGhlIEpVbml0IGphciBmcm9tIHRoZSBmcmFtZXdvcmsgbG9jYXRpb24gdG8gdGhlIHByb2plY3QgY2xhc3NwYXRoLgotICAgICAqIEBwYXJhbSB3b3Jrc3BhY2UKLSAgICAgKiBAcmV0dXJuIGFic29sdXRlIHBhdGggbG9jYXRpb24gb2YgdGhlIGNvcHlpbmcgZmlsZQotICAgICAqIEB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIENvcHlKVW5pdEphclRvUHJvamVjdChTdHJpbmcgd29ya3NwYWNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgCUZpbGUgcmVsYXRpdmVXZWJJbmZKdW5pdEZpbGUgPSBuZXcgRmlsZShGaWxlVXRpbHMuYWRkQW5vdGhlck5vZGVUb1BhdGgoCi0gICAgCQkJCQkJCQkJCQkJSjJFRVV0aWxzLmdldFdlYkluZlBhdGgocHJvamVjdCkudG9PU1N0cmluZygpLAotICAgIAkJCQkJCQkJCQkJCUF4aXMyQ29uc3RhbnRzLkRJUl9MSUIrRmlsZS5zZXBhcmF0b3IrCi0gICAgCQkJCQkJCQkJCQkJQXhpczJDb25zdGFudHMuSlVOSVRfSkFSKSk7Ci0gICAgCQotICAgIAlGaWxlIG9ic2FsdXRlV2ViSW5mSnVuaXRGaWxlID0gbmV3IEZpbGUoRmlsZVV0aWxzLmFkZEFub3RoZXJOb2RlVG9QYXRoKAotICAgIAkJCQkJCQkJCQkJCQkJd29ya3NwYWNlLCAKLSAgICAJCQkJCQkJCQkJCQkJCXJlbGF0aXZlV2ViSW5mSnVuaXRGaWxlLnRvU3RyaW5nKCkpKTsKLSAgICAJSUVudmlyb25tZW50IGVudmlyb25tZW50ID0gZ2V0RW52aXJvbm1lbnQoKTsKLQkJSVN0YXR1c0hhbmRsZXIgc3RhdHVzSGFuZGxlciA9IGVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKTsJCi0gICAgCUNvbnRlbnRDb3B5VXRpbHMgY29udGVudENvcHlVdGlscyA9IG5ldyBDb250ZW50Q29weVV0aWxzKCk7Ci0gICAgCWNvbnRlbnRDb3B5VXRpbHMuY29weURpcmVjdG9yeVJlY3Vyc2l2ZWx5SW50b1dvcmtzcGFjZSgKLSAgICAJCQlnZXRGcmFtZXdvcmtKdW5pdEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKSwKLSAgICAJCQlvYnNhbHV0ZVdlYkluZkp1bml0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgCi0gICAgCQkJbW9uaXRvciwgc3RhdHVzSGFuZGxlcik7Ci0JCXJldHVybiBvYnNhbHV0ZVdlYkluZkp1bml0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiByZXR1cm5zIHRoZSBGcmFtZXdvcmsgSlVuaXQgRmlsZSBsb2NhdGlvbi4KLSAgICAgKiBAcmV0dXJuCi0gICAgICogQHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24KLSAgICAgKi8KLQlwcml2YXRlIEZpbGUgZ2V0RnJhbWV3b3JrSnVuaXRGaWxlKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgCUlQYXRoIGp1bml0SmFyUGF0aD1CdW5kbGVVdGlscy5nZXRKYXJyZWRQbHVnaW5QYXRoKEF4aXMyQ29uc3RhbnRzLkpVTklUX0JVTkRMRSk7Ci0gICAgCWlmIChqdW5pdEphclBhdGggIT0gbnVsbCl7Ci0gICAgCQlyZXR1cm4gbmV3IEZpbGUoRmlsZVV0aWxzLmFkZEFub3RoZXJOb2RlVG9QYXRoKGp1bml0SmFyUGF0aC50b09TU3RyaW5nKCksCi0gICAgCQkJCUF4aXMyQ29uc3RhbnRzLkpVTklUX0pBUikpOwotICAgIAl9ZWxzZXsKLSAgICAJCXRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24oQXhpczJDb25zdW1wdGlvblVJTWVzc2FnZXMuRVJST1JfSlVOSVRfSkFSX05PVF9GT1VORCk7Ci0gICAgCX0KLSAgICB9Ci0KLQkvKioKLQkgKiByZXR1cm5zIHRoZSBwYXRoIHRvIHRoZSBuZXdseSBnZW5lcmF0ZWQgdGVzdCBmb2xkZXIgCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcGFyYW0gd29ya3NwYWNlCi0JICogQHJldHVybiBJUGF0aCB0byB0aGUgdGVzdCBmb2xkZXIKLQkgKi8KLSAgICBwcml2YXRlIElQYXRoIGdldFBhdGhUb1Rlc3RGb2xkZXIoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHdvcmtzcGFjZSkgewotICAgICAgICBTdHJpbmcgcGF0aFRvVGVzdCA9IHByb2plY3QuZ2V0RnVsbFBhdGgoKS50b09TU3RyaW5nKCkgKyBGaWxlLnNlcGFyYXRvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgQXhpczJDb25zdGFudHMuRElSX1RFU1Q7Ci0gICAgICAgIElQYXRoIHBhdGhUb1Rlc3RGb2xkZXIgPSBuZXcgUGF0aChwYXRoVG9UZXN0KTsKLSAgICAgICAgcmV0dXJuIHBhdGhUb1Rlc3RGb2xkZXI7Ci0gICAgfQotICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29uc3VtcHRpb24vY29yZS9jb21tYW5kL0F4aXMyV2Vic2VydmljZXNTZXJ2ZXJDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29uc3VtcHRpb24vY29yZS9jb21tYW5kL0F4aXMyV2Vic2VydmljZXNTZXJ2ZXJDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YWNlZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NvbnN1bXB0aW9uL2NvcmUvY29tbWFuZC9BeGlzMldlYnNlcnZpY2VzU2VydmVyQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBXU08yIEluYy4gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogV1NPMiBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDcwMTEwICAgMTY4NzYyIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgY29kZSB0byBpbnRyb2R1c2UgdGhlIEF4aXMyIAotICogCQkJCQkJCQkJCSAgcnVudGltZSB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjIKLSAqIDIwMDgwMTE0ICAgMjA5NDExIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEZpeCBmb3IgdGhlIDIwOTQxMSwgP3dzZGwgbm90IHVwZGF0ZSAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS5kYXRhLkRhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgQXhpczJXZWJzZXJ2aWNlc1NlcnZlckNvbW1hbmQgZXh0ZW5kcwotQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gewotCi0JU3RyaW5nIHByb2plY3Q7Ci0JRGF0YU1vZGVsIG1vZGVsOwotCXB1YmxpYyBBeGlzMldlYnNlcnZpY2VzU2VydmVyQ29tbWFuZChEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwcm9qZWN0KXsKLQkJdGhpcy5tb2RlbD1tb2RlbDsKLQkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQotCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCW1vZGVsLnNldFdlYlByb2plY3ROYW1lKHByb2plY3QpOwotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb25zdW1wdGlvbi9jb3JlL2RhdGEvRGF0YU1vZGVsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29uc3VtcHRpb24vY29yZS9kYXRhL0RhdGFNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2M3NmRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb25zdW1wdGlvbi9jb3JlL2RhdGEvRGF0YU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBXU08yIEluYy4gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogV1NPMiBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDcwMTEwICAgMTY4NzYyIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgY29kZSB0byBpbnRyb2R1c2UgdGhlIEF4aXMyIAotICogCQkJCQkJCQkJCSAgcnVudGltZSB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjIKLSAqIDIwMDcwNDI2ICAgMTgzMDQ2IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS5kYXRhOwotCi1wdWJsaWMgY2xhc3MgRGF0YU1vZGVsIGV4dGVuZHMgTW9kZWx7Ci0JCi0JLy9Db25zdW1wdGlvbiBEYXRhTW9kZWwgUGFyYW1ldGVycwotCQotCXByaXZhdGUgU3RyaW5nIAlzZXJ2aWNlQ2xhc3M7Ci0JcHJpdmF0ZSBTdHJpbmcgCWRhdGFiaW5kaW5nVHlwZTsKLQlwcml2YXRlIFN0cmluZyAJbmFtZXNwYXNlVG9QYWNrYWdlTWFwcGluZzsKLQkvL0RlZmF1bHQgc2V0dGluZyBpcyB0byBnZW5lcmF0ZSBib3RoIHN5bmMgYW5kIGFzeW5jCi0JcHJpdmF0ZSBib29sZWFuCVN5bmMgPSBmYWxzZTsgCi0JcHJpdmF0ZSBib29sZWFuCUFTeW5jID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGdlbmVyYXRlQWxsQ2hlY2sgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gdGVzdENhc2VDaGVjayA9IGZhbHNlOwotCi0JCi0JcHVibGljIFN0cmluZyBnZXREYXRhYmluZGluZ1R5cGUoKSB7Ci0JCXJldHVybiBkYXRhYmluZGluZ1R5cGU7Ci0JfQotCXB1YmxpYyB2b2lkIHNldERhdGFiaW5kaW5nVHlwZShTdHJpbmcgZGF0YWJpbmRpbmdUeXBlKSB7Ci0JCXRoaXMuZGF0YWJpbmRpbmdUeXBlID0gZGF0YWJpbmRpbmdUeXBlOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlQWxsQ2hlY2soKSB7Ci0JCXJldHVybiBnZW5lcmF0ZUFsbENoZWNrOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZUFsbENoZWNrKGJvb2xlYW4gZ2VuZXJhdGVBbGxDaGVjaykgewotCQl0aGlzLmdlbmVyYXRlQWxsQ2hlY2sgPSBnZW5lcmF0ZUFsbENoZWNrOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFzZVRvUGFja2FnZU1hcHBpbmcoKSB7Ci0JCXJldHVybiBuYW1lc3Bhc2VUb1BhY2thZ2VNYXBwaW5nOwotCX0KLQlwdWJsaWMgdm9pZCBzZXROYW1lc3Bhc2VUb1BhY2thZ2VNYXBwaW5nKFN0cmluZyBuYW1lc3Bhc2VUb1BhY2thZ2VNYXBwaW5nKSB7Ci0JCXRoaXMubmFtZXNwYXNlVG9QYWNrYWdlTWFwcGluZyA9IG5hbWVzcGFzZVRvUGFja2FnZU1hcHBpbmc7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYWNrYWdlVGV4dCgpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFBhY2thZ2VUZXh0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFja2FnZVRleHQoU3RyaW5nIHBhY2thZ2VUZXh0KSB7Ci0JCXN1cGVyLnNldFBhY2thZ2VUZXh0KHBhY2thZ2VUZXh0KTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRQb3J0TmFtZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFBvcnROYW1lKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UG9ydE5hbWUoU3RyaW5nIHBvcnROYW1lKSB7Ci0JCXN1cGVyLnNldFBvcnROYW1lKHBvcnROYW1lKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlQ2xhc3MoKSB7Ci0JCXJldHVybiBzZXJ2aWNlQ2xhc3M7Ci0JfQotCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VDbGFzcyhTdHJpbmcgc2VydmljZUNsYXNzKSB7Ci0JCXRoaXMuc2VydmljZUNsYXNzID0gc2VydmljZUNsYXNzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZU5hbWUoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRTZXJ2aWNlTmFtZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VOYW1lKFN0cmluZyBzZXJ2aWNlTmFtZSkgewotCQlzdXBlci5zZXRTZXJ2aWNlTmFtZShzZXJ2aWNlTmFtZSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0V3NkbFVSSSgpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFdzZGxVUkkoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRXc2RsVVJJKFN0cmluZyB3c2RsVVJJKSB7Ci0JCXN1cGVyLnNldFdzZGxVUkkod3NkbFVSSSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzQVN5bmMoKSB7Ci0JCXJldHVybiBBU3luYzsKLQl9Ci0JcHVibGljIHZvaWQgc2V0QVN5bmMoYm9vbGVhbiBhc3luYykgewotCQlBU3luYyA9IGFzeW5jOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc1N5bmMoKSB7Ci0JCXJldHVybiBTeW5jOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRTeW5jKGJvb2xlYW4gc3luYykgewotCQlTeW5jID0gc3luYzsKLQl9Ci0JcHVibGljIGJvb2xlYW4gaXNUZXN0Q2FzZUNoZWNrKCkgewotCQlyZXR1cm4gdGVzdENhc2VDaGVjazsKLQl9Ci0JcHVibGljIHZvaWQgc2V0VGVzdENhc2VDaGVjayhib29sZWFuIHRlc3RDYXNlQ2hlY2spIHsKLQkJdGhpcy50ZXN0Q2FzZUNoZWNrID0gdGVzdENhc2VDaGVjazsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb25zdW1wdGlvbi9jb3JlL2RhdGEvTW9kZWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb25zdW1wdGlvbi9jb3JlL2RhdGEvTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIxYjc3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29uc3VtcHRpb24vY29yZS9kYXRhL01vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IFdTTzIgSW5jLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBXU08yIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzAyMTMgICAxNjg3NjIgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgSW5pdGlhbCBjb2RlIHRvIGludHJvZHVzZSB0aGUgQXhpczIgCi0gKiAJCQkJCQkJCQkJICBydW50aW1lIHRvIHRoZSBmcmFtZXdvcmsgZm9yIDE2ODc2MgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLmRhdGE7Ci0KLXB1YmxpYyBjbGFzcyBNb2RlbCB7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgIHdlYlByb2plY3ROYW1lOwotCQotCXByaXZhdGUgYm9vbGVhbiBzZXJ2ZXJTdGF0dXM7Ci0JcHJpdmF0ZSBTdHJpbmcgIHdzZGxVUkk7Ci0JcHJpdmF0ZSBTdHJpbmcgcG9ydE5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgc2VydmljZU5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgcGFja2FnZVRleHQ7Ci0JCi0JcHVibGljIFN0cmluZyBnZXRQYWNrYWdlVGV4dCgpIHsKLQkJcmV0dXJuIHBhY2thZ2VUZXh0OwotCX0KLQlwdWJsaWMgdm9pZCBzZXRQYWNrYWdlVGV4dChTdHJpbmcgcGFja2FnZVRleHQpIHsKLQkJdGhpcy5wYWNrYWdlVGV4dCA9IHBhY2thZ2VUZXh0OwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldFBvcnROYW1lKCkgewotCQlyZXR1cm4gcG9ydE5hbWU7Ci0JfQotCXB1YmxpYyB2b2lkIHNldFBvcnROYW1lKFN0cmluZyBwb3J0TmFtZSkgewotCQl0aGlzLnBvcnROYW1lID0gcG9ydE5hbWU7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZU5hbWUoKSB7Ci0JCXJldHVybiBzZXJ2aWNlTmFtZTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0U2VydmljZU5hbWUoU3RyaW5nIHNlcnZpY2VOYW1lKSB7Ci0JCXRoaXMuc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRXc2RsVVJJKCkgewotCQlyZXR1cm4gd3NkbFVSSTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0V3NkbFVSSShTdHJpbmcgd3NkbFVSSSkgewotCQl0aGlzLndzZGxVUkkgPSB3c2RsVVJJOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBnZXRTZXJ2ZXJTdGF0dXMoKSB7Ci0JCXJldHVybiBzZXJ2ZXJTdGF0dXM7Ci0JfQotCXB1YmxpYyB2b2lkIHNldFNlcnZlclN0YXR1cyhib29sZWFuIGIpIHsKLQkJdGhpcy5zZXJ2ZXJTdGF0dXMgPSBiOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFdlYlByb2plY3ROYW1lKCkgewotCQlyZXR1cm4gd2ViUHJvamVjdE5hbWU7Ci0JfQotCXB1YmxpYyB2b2lkIHNldFdlYlByb2plY3ROYW1lKFN0cmluZyB3ZWJQcm9qZWN0TmFtZSkgewotCQl0aGlzLndlYlByb2plY3ROYW1lID0gd2ViUHJvamVjdE5hbWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29uc3VtcHRpb24vY29yZS9tZXNzYWdlcy9BeGlzMkNvbnN1bXB0aW9uVUkucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb25zdW1wdGlvbi9jb3JlL21lc3NhZ2VzL0F4aXMyQ29uc3VtcHRpb25VSS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDk4MjY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb25zdW1wdGlvbi9jb3JlL21lc3NhZ2VzL0F4aXMyQ29uc3VtcHRpb25VSS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgV1NPMiBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0jIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIDIwMDcwMTEwICAgMTY4NzYyIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgY29kZSB0byBpbnRyb2R1Y2UgdGhlIEF4aXMyIAotIwkJCQkJCQkJCQkgcnVudGltZSB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjIKLSMgMjAwNzA1MTEgICAxODY0NDAgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCBmaXggMTg2NDQwCi0jIDIwMDcwNTE3ICAgMTg3MzA3IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgKLSMgMjAwNzA1MTggICAxODczMTEgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgRml4aW5nIHRlc3QgcmVzb3VyY2UgYWRkaXRpb24KLSMgMjAwNzA2MDEgICAxOTA1MDUgcG1vb2drQGNhLmlibS5jb20gLSBQZXRlciBNb29nawotIyAyMDA4MDExNiAgIDIwOTQxMSBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbnRyb2R1Y2VkIGZvciB0aGUgRml4IDIwOTQxMQotIyAyMDA4MDEzMCAgIDIxNjk5NyBrYXRlcEB3c28yLmNvbSAtIEthdGUgUHJpY2UKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotCi1MQUJFTF9TRVJWSUNFX05BTUVfQ0FQVElPTj1TZXJ2aWNlIE5hbWUKLUxBQkVMX0dFTkVSQVRFX1RFU1RDQVNFX0NBUFRJT049R2VuZXJhdGUgYSBKVW5pdCB0ZXN0IGNhc2UgdG8gdGVzdCB0aGUgc2VydmljZQotTEFCRUxfREFUQUJJTkRJTkdfQ0FQVElPTj1EYXRhYmluZGluZwotTEFCRUxfUE9SVE5BTUU9UG9ydCBOYW1lCi1MQUJFTF9HRU5FUkFURV9BTEw9R2VuZXJhdGUgYWxsIHR5cGVzIGZvciBhbGwgZWxlbWVudHMgcmVmZXJyZWQgdG8gYnkgc2NoZW1hcwotTEFCRUxfUEFDS0VHRV9OQU1FPUN1c3RvbSBwYWNrYWdlIG5hbWUKLUxBQkVMX05BTUVTUEFDRT1OYW1lc3BhY2UKLUxBQkVMX1BBQ0tBR0U9UGFja2FnZQotTEFCRUxfQ0xJRU5UX1NJREU9Q2xpZW50IG1vZGUKLUxBQkVMX1NZTkNfQU5EX0FTWU5DPUdlbmVyYXRlIGEgY2xpZW50IHdoaWNoIHN1cHBvcnRzIGJvdGggc3luY2hyb25vdXMgYW5kIGFzeW5jaHJvbm91cyBpbnZvY2F0aW9uCi1MQUJFTF9TWU5DPUdlbmVyYXRlIGEgc3luY2hyb25vdXMgY2xpZW50Ci1MQUJFTF9BU1lOQz1HZW5lcmF0ZSBhbiBhc3luY2hyb25vdXMgY2xpZW50Ci0KLVBBR0VfVElUTEVfV1NfQVhJUzJfUFJPWFk9QXhpczIgQ2xpZW50IFdlYiBTZXJ2aWNlIENvbmZpZ3VyYXRpb24gCi1QQUdFX0RFU0NfV1NfQVhJUzJfUFJPWFk9U2VsZWN0IHRoZSBhcHByb3ByaWF0ZSBjb2RlIGdlbmVyYXRpb24gc2V0dGluZ3MgCi0KLUVSUk9SX0lOVkFMSURfRklMRV9SRUFEX1dSSVRFTD1FeGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgcmVhZGluZyBvciB3cml0aW5nIGZpbGVzIHswfQotRVJST1JfSU5WQUxJRF9XU0RMX0ZJTEVfUkVBRF9XUklURUw9RXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIHJlYWRpbmcgb3Igd3JpdGluZyBXU0RMIHswfQotRVJST1JfQ09ERUdFTl9FWENFUFRJT049RXhjZXB0aW9uIG9jY3VycmVkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gZm9yIFdTREwgezB9Ci1FUlJPUl9KVU5JVF9KQVJfTk9UX0ZPVU5EPUV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSBjb3B5aW5nIGp1bml0LmphcgotRVJST1JfV1NETF9QSU5HX1RJTUVfT1VUPUNvdWxkIG5vdCByZXRyaWV2ZSB0aGUgV1NETC4gVGltZW91dCBvY2N1cnJlZC4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb25zdW1wdGlvbi9jb3JlL21lc3NhZ2VzL0F4aXMyQ29uc3VtcHRpb25VSU1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29uc3VtcHRpb24vY29yZS9tZXNzYWdlcy9BeGlzMkNvbnN1bXB0aW9uVUlNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzNkMmVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb25zdW1wdGlvbi9jb3JlL21lc3NhZ2VzL0F4aXMyQ29uc3VtcHRpb25VSU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IFdTTzIgSW5jLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBXU08yIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzAxMTAgICAxNjg3NjIgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgSW5pdGlhbCBjb2RlIHRvIGludHJvZHVzZSB0aGUgQXhpczIgcnVudGltZSB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjIKLSAqIDIwMDcwNDI2ICAgMTgzMDQ2IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgKLSAqIDIwMDcwNTExICAgMTg2NDQwIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGggZml4IDE4NjQ0MAotICogMjAwNzA1MTcgICAxODczMDcgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aAotICogMjAwNzA1MTggICAxODczMTEgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgRml4aW5nIHRlc3QgcmVzb3VyY2UgYWRkaXRpb24KLSAqIDIwMDcwNjAxICAgMTkwNTA1IHBtb29na0BjYS5pYm0uY29tIC0gUGV0ZXIgTW9vZ2sKLSAqIDIwMDcwODI0ICAgMjAwNTE1IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIE5PTi1OTFMgbW92ZSB0byBzZXBlcmF0ZSBmaWxlCi0gKiAyMDA4MDExNiAgICBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbnRyb2R1Y2VkIGZvciB0aGUgRml4IDIwOTQxMQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLm1lc3NhZ2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGZpbmFsIGNsYXNzIEF4aXMyQ29uc3VtcHRpb25VSU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9IAotCQkib3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUubWVzc2FnZXMuQXhpczJDb25zdW1wdGlvblVJIjsvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBBeGlzMkNvbnN1bXB0aW9uVUlNZXNzYWdlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfU0VSVklDRV9OQU1FX0NBUFRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfR0VORVJBVEVfVEVTVENBU0VfQ0FQVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9EQVRBQklORElOR19DQVBUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX1BPUlROQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX0dFTkVSQVRFX0FMTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9QQUNLRUdFX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfTkFNRVNQQUNFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX1BBQ0tBR0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfQ0xJRU5UX1NJREU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfU1lOQ19BTkRfQVNZTkM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfU1lOQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9BU1lOQzsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQQUdFX1RJVExFX1dTX0FYSVMyX1BST1hZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBBR0VfREVTQ19XU19BWElTMl9QUk9YWTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJPUl9JTlZBTElEX0ZJTEVfUkVBRF9XUklURUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJST1JfSU5WQUxJRF9XU0RMX0ZJTEVfUkVBRF9XUklURUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJST1JfQ09ERUdFTl9FWENFUFRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJST1JfSlVOSVRfSkFSX05PVF9GT1VORDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJPUl9XU0RMX1BJTkdfVElNRV9PVVQ7Ci0JCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQXhpczJDb25zdW1wdGlvblVJTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb25zdW1wdGlvbi9jb3JlL3BsdWdpbi9XZWJTZXJ2aWNlQXhpczJDb25zdW1wdGlvbkNvcmVQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb25zdW1wdGlvbi9jb3JlL3BsdWdpbi9XZWJTZXJ2aWNlQXhpczJDb25zdW1wdGlvbkNvcmVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY5Y2JjMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29uc3VtcHRpb24vY29yZS9wbHVnaW4vV2ViU2VydmljZUF4aXMyQ29uc3VtcHRpb25Db3JlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IFdTTzIgSW5jLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBXU08yIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzA0MjYgICAxODMwNDYgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLnBsdWdpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZUF4aXMyQ29uc3VtcHRpb25Db3JlUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZSI7Ci0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0JcHJpdmF0ZSBzdGF0aWMgV2ViU2VydmljZUF4aXMyQ29uc3VtcHRpb25Db3JlUGx1Z2luIHBsdWdpbjsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgV2ViU2VydmljZUF4aXMyQ29uc3VtcHRpb25Db3JlUGx1Z2luKCkgewotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKgotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgV2ViU2VydmljZUF4aXMyQ29uc3VtcHRpb25Db3JlUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29uc3VtcHRpb24vY29yZS91dGlscy9Db250ZW50Q29weVV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29uc3VtcHRpb24vY29yZS91dGlscy9Db250ZW50Q29weVV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMjZiOTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NvbnN1bXB0aW9uL2NvcmUvdXRpbHMvQ29udGVudENvcHlVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDExOCAgIDE2ODc2MiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbml0aWFsIGNvZGUgdG8gaW50cm9kdXNlIHRoZSBBeGlzMiBydW50aW1lIHRvIHRoZSBmcmFtZXdvcmsgZm9yIDE2ODc2MgotICogMjAwNzA0MjYgICAxODMwNDYgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLnV0aWxzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS5tZXNzYWdlcy5BeGlzMkNvbnN1bXB0aW9uVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29udGV4dC5SZXNvdXJjZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JU3RhdHVzSGFuZGxlcjsKLQotcHVibGljIGNsYXNzIENvbnRlbnRDb3B5VXRpbHMgewotCi0JcHJpdmF0ZSBMaXN0IGZpbGVBbmREaXJlY3Rvcmllc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JRmlsZUlucHV0U3RyZWFtIGZpblN0cmVhbSA9IG51bGw7CQkKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgY29weSB0aGUgc291cmNlIGRpcmVjdG9yeSBpbnRvIHRoZSBlY2xpcHNlIHdvcmtzcGFjZSBhY2NvcmRpbmcgCi0JICogdG8gdGhlIEVjbGlwc2UgRnJhbWV3b3JrIEFQSQotCSAqIEBwYXJhbSBzb3VyY2VEaXIKLQkgKiBAcGFyYW0gZGVzdGluYXRpb25EaXIKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqIEBwYXJhbSBzdGF0dXNIYW5kbGVyCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGNvcHlEaXJlY3RvcnlSZWN1cnNpdmVseUludG9Xb3Jrc3BhY2UoU3RyaW5nIHNvdXJjZURpciwgCi0JCQkJU3RyaW5nIGRlc3RpbmF0aW9uRGlyLAotCQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKLQkJCQlJU3RhdHVzSGFuZGxlciBzdGF0dXNIYW5kbGVyKSB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJZmlsZUFuZERpcmVjdG9yaWVzTGlzdC5jbGVhcigpOwotCQlGaWxlIGF4aXMyV2ViYXBwRm9sZGVyID0gbmV3IEZpbGUoc291cmNlRGlyKTsKLQkJdmlzaXRBbGxEaXJzQW5kRmlsZXMoYXhpczJXZWJhcHBGb2xkZXIpOwotCQlMaXN0IGRlcGxveUZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlkZXBsb3lGaWxlcz0gZmlsZUFuZERpcmVjdG9yaWVzTGlzdDsKLQotCQl0cnkgewotCi0JCQkvL0ltcG9ydCB0aGUgYXhpczIgZGVwZW5kZW5jeSBwbHVnaW4gYWNjb3JkaW5nIHRvIHRoZSBSZXNvdXJjZXMgQVBJIG9mIGVjbGlwc2UgCi0JCQlSZXNvdXJjZUNvbnRleHQgY29udGV4dCA9IFdlYlNlcnZpY2VQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRSZXNvdXJjZUNvbnRleHQoKTsJCi0KLQkJCUlQYXRoIG91dHB1dFBhdGggPSBuZXcgUGF0aCAoZGVzdGluYXRpb25EaXIpOwotCi0JCQlTdHJpbmcgZmlsZU5hbWU7Ci0JCQlJUGF0aCB0YXJnZXRQYXRoPW51bGw7Ci0JCQlib29sZWFuIGlzRGlyZWN0b3J5ID0gZmFsc2U7Ci0KLQkJCVN0cmluZyBkZXBsb3lGaWxlOwotCQkJSXRlcmF0b3IgaXRlcmF0b3I7Ci0KLQkJCVN0cmluZyB0ZW1wT3V0cHV0RGlyID0gYXhpczJXZWJhcHBGb2xkZXIudG9TdHJpbmcoKTsKLQkJCWl0ZXJhdG9yID0gZGVwbG95RmlsZXMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlkZXBsb3lGaWxlID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCQkJCUZpbGUgc291cmNlID0gbmV3IEZpbGUoZGVwbG95RmlsZSk7Ci0JCQkJaWYgKHNvdXJjZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJCWlzRGlyZWN0b3J5ID10cnVlOwotCQkJCX1lbHNlewotCQkJCQlpc0RpcmVjdG9yeT1mYWxzZTsKLQkJCQkJZmluU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShzb3VyY2UpOwotCQkJCX0KLQotCQkJCWlmIChkZXBsb3lGaWxlLnN0YXJ0c1dpdGgodGVtcE91dHB1dERpcikpIHsKLQkJCQkJZmlsZU5hbWUgPSBkZXBsb3lGaWxlLnN1YnN0cmluZyh0ZW1wT3V0cHV0RGlyLmxlbmd0aCgpKTsKLQkJCQkJdGFyZ2V0UGF0aCA9IG91dHB1dFBhdGguYXBwZW5kKGZpbGVOYW1lKS5tYWtlQWJzb2x1dGUoKTsKLQkJCQkJaWYgKGlzRGlyZWN0b3J5KXsKLQkJCQkJCW9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb21tb24uRmlsZVJlc291cmNlVXRpbHMKLQkJCQkJCS5tYWtlRm9sZGVyUGF0aEF0TG9jYXRpb24oY29udGV4dCwgIAotCQkJCQkJCQl0YXJnZXRQYXRoLAotCQkJCQkJCQltb25pdG9yLAotCQkJCQkJCQlzdGF0dXNIYW5kbGVyKTsKLQkJCQkJfWVsc2V7Ci0JCQkJCQlpZiAoZmluU3RyZWFtICE9IG51bGwpIHsKLQkJCQkJCQlvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29tbW9uLkZpbGVSZXNvdXJjZVV0aWxzCi0JCQkJCQkJLmNyZWF0ZUZpbGVBdExvY2F0aW9uKGNvbnRleHQsICAKLQkJCQkJCQkJCXRhcmdldFBhdGgsCi0JCQkJCQkJCQlmaW5TdHJlYW0sCi0JCQkJCQkJCQltb25pdG9yLAotCQkJCQkJCQkJc3RhdHVzSGFuZGxlcik7Ci0JCQkJCQl9Ci0JCQkJCQlmaW5TdHJlYW0uY2xvc2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJc3RhdHVzID0gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoCi0JCQkJCU5MUy5iaW5kKEF4aXMyQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkVSUk9SX0lOVkFMSURfRklMRV9SRUFEX1dSSVRFTCwKLQkJCQkJCQluZXcgU3RyaW5nW117ZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCl9KSwgZSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJc3RhdHVzID0gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoCi0JCQkJCU5MUy5iaW5kKEF4aXMyQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkVSUk9SX0lOVkFMSURfRklMRV9SRUFEX1dSSVRFTCwKLQkJCQkJCQluZXcgU3RyaW5nW117ZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCl9KSwgZSk7Ci0JCX0KLQotCQlyZXR1cm4gc3RhdHVzOwotCi0JfQotCi0JLy8JUHJvY2VzcyBhbGwgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIHVuZGVyIGRpcgotCXByaXZhdGUgdm9pZCB2aXNpdEFsbERpcnNBbmRGaWxlcyhGaWxlIGRpcikgewotCi0JCWZpbGVBbmREaXJlY3Rvcmllc0xpc3QuYWRkKGRpci5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0KLQkJaWYgKGRpci5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlTdHJpbmdbXSBjaGlsZHJlbiA9IGRpci5saXN0KCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8Y2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQl2aXNpdEFsbERpcnNBbmRGaWxlcyhuZXcgRmlsZShkaXIsIGNoaWxkcmVuW2ldKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb25zdW1wdGlvbi9jb3JlL3V0aWxzL0RlZmF1bHRDb2RlZ2VuVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NvbnN1bXB0aW9uL2NvcmUvdXRpbHMvRGVmYXVsdENvZGVnZW5VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MDU0YTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NvbnN1bXB0aW9uL2NvcmUvdXRpbHMvRGVmYXVsdENvZGVnZW5VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IFdTTzIgSW5jLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBXU08yIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzAyMDYgICAxNjg3NjIgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgSW5pdGlhbCBjb2RlIHRvIGludHJvZHVzZSB0aGUgQXhpczIgCi0gKiAJCQkJCQkJCQkJICBydW50aW1lIHRvIHRoZSBmcmFtZXdvcmsgZm9yIDE2ODc2MgotICogMjAwNzA0MjYgICAxODMwNDYgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLnV0aWxzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS5kYXRhLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLm1lc3NhZ2VzLkF4aXMyQ29uc3VtcHRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLnV0aWxzLkNsYXNzTG9hZGluZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q29kZWdlblV0aWwgewotCQotCXByaXZhdGUgV1NETFByb3BlcnR5UmVhZGVyIHJlYWRlcjsKLQlwcml2YXRlIE1vZGVsIG1vZGVsOwotCXByaXZhdGUgTGlzdCBzZXJ2aWNlUU5hbWVMaXN0ID0gbnVsbDsKLQlJU3RhdHVzIHN0YXR1czsKLQkKLQlwdWJsaWMgRGVmYXVsdENvZGVnZW5VdGlsKG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLmRhdGEuRGF0YU1vZGVsIG1vZGVsKXsKLQkJdGhpcy5tb2RlbD1tb2RlbDsKLQl9Ci0JCi0JcHVibGljIERlZmF1bHRDb2RlZ2VuVXRpbChvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS5kYXRhLkRhdGFNb2RlbCBtb2RlbCl7Ci0JCXRoaXMubW9kZWw9bW9kZWw7Ci0JfQotCi0JLyoqCi0JICogcG9wdWxhdGUgdGhlIG1vZGVsIGZvciB0aGUgZGVmYXVsdCBzY2VuYXJpbyBmcm9tIHRoZSB3c2RsIHVybAotCSAqLwotCXB1YmxpYyB2b2lkIHBvcHVsYXRlTW9kZWxQYXJhbXNGcm9tV1NETCgpIHsKLQkJc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJaWYgKHJlYWRlciA9PSBudWxsKQotCQkJcmVhZGVyID0gbmV3IFdTRExQcm9wZXJ0eVJlYWRlcigpOwotCQl0cnkgewotCQkJU3RyaW5nIGxuYW1lID0gbW9kZWwuZ2V0V3NkbFVSSSgpOwotCQkJaWYgKCEiIi5lcXVhbHMobG5hbWUudHJpbSgpKSkgewotCi0JCQkJcmVhZGVyLnJlYWRXU0RMKG1vZGVsLmdldFdlYlByb2plY3ROYW1lKCksIGxuYW1lKTsKLQotCQkJCXRoaXMuc2VydmljZVFOYW1lTGlzdCA9IHJlYWRlci5nZXRTZXJ2aWNlTGlzdCgpOwotCQkJCWlmICghc2VydmljZVFOYW1lTGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkJLy8gYWRkIHRoZSBsb2NhbCBwYXJ0IG9mIHRoZQotCQkJCQlPYmplY3Qgc2VydmljZVFuYW1lSW5zdGFuY2UgPSBzZXJ2aWNlUU5hbWVMaXN0LmdldCgwKTsKLQkJCQkJQ2xhc3MgUU5hbWVDbGFzcyA9IENsYXNzTG9hZGluZ1V0aWwKLQkJCQkJCQkubG9hZENsYXNzRnJvbUFudENsYXNzTG9hZGVyKCJqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIik7Ci0JCQkJCU1ldGhvZCBHZXRMb2NhbFBhcnRNZXRob2QgID0gUU5hbWVDbGFzcy5nZXRNZXRob2QoImdldExvY2FsUGFydCIsIG51bGwpOwotCQkJCQlPYmplY3QgcmVzdWx0TG9jYWxQYXJ0ID0gR2V0TG9jYWxQYXJ0TWV0aG9kLmludm9rZShzZXJ2aWNlUW5hbWVJbnN0YW5jZSwgbnVsbCk7Ci0JCQkJCW1vZGVsLnNldFNlcnZpY2VOYW1lKHJlc3VsdExvY2FsUGFydC50b1N0cmluZygpKTsKLQkJCQkJLy8gbG9hZCB0aGUgcG9ydHMKLQkJCQkJIGxvYWRQb3J0TmFtZXMoKTsKLQkJCQl9IAotCQkJCXBvcHVsYXRlUGFja2FnZU5hbWUoKTsKLQkJCQkvL3BvcHVsYXRlIHRoZSBuYW1lc3BhY2VzcwotCQkJCS8vbG9hZE5hbWVzcGFjZXMocmVhZGVyLmdldERlZmluaXRpb25OYW1lc3BhY2VNYXAoKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlzdGF0dXMgPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyhOTFMuYmluZCgKLQkJCQkJQXhpczJDb25zdW1wdGlvblVJTWVzc2FnZXMuRVJST1JfSU5WQUxJRF9XU0RMX0ZJTEVfUkVBRF9XUklURUwsCi0JCQkJCW5ldyBTdHJpbmdbXXtlLmdldExvY2FsaXplZE1lc3NhZ2UoKX0pLCBlKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgbG9hZFBvcnROYW1lcygpIHsKLQkJCWphdmEudXRpbC5MaXN0IHBvcnRzID0gcmVhZGVyLmdldFBvcnROYW1lTGlzdChzZXJ2aWNlUU5hbWVMaXN0LmdldCgwKSk7Ci0JCQkJCS8vIGFkZCB0aGUgbG9jYWwgcGFydCBvZiB0aGUKLQkJCQkJbW9kZWwuc2V0UG9ydE5hbWUocG9ydHMuZ2V0KDApLnRvU3RyaW5nKCkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVQYWNrYWdlTmFtZSgpIHsKLQkJbW9kZWwuc2V0UGFja2FnZVRleHQocmVhZGVyLnBhY2thZ2VGcm9tVGFyZ2V0TmFtZXNwYWNlKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NvbnN1bXB0aW9uL2NvcmUvdXRpbHMvU2VydmljZVBpbmdVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29uc3VtcHRpb24vY29yZS91dGlscy9TZXJ2aWNlUGluZ1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQyYjU5OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29uc3VtcHRpb24vY29yZS91dGlscy9TZXJ2aWNlUGluZ1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA4MDExNiAgICBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbnRyb2R1Y2VkIGZvciB0aGUgRml4IDIwOTQxMQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETCByZXRyaWV2YWwgaXNzdWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS51dGlsczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS5tZXNzYWdlcy5BeGlzMkNvbnN1bXB0aW9uVUlNZXNzYWdlczsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIGZvciB0aGUgc2VydmljZSBwaW5nCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlUGluZ1V0aWwgewotCS8qKgotCSAqIFdTREwgUmV0cmlldmUgVGltZW91dAotCSAqLwotCWludCB0aW1lVE9SZXRyaWV2ZVdTREwgPSAxMDAwMCA7IC8vIERlZmF1bHQgaXMgMTAgc2VjIAotCQotCS8qKgotCSAqIFV0aWxpdHkgbWV0aG9kIHRvIGNvbm5lY3QgdG8gYSBwYXJ0aWN1bGFyIFVSTAotCSAqIEBwYXJhbSB1cmwKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb25uZWN0VG9VUkwoU3RyaW5nIHVybFN0cmluZykgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJVVJMIHVybCA9IG5ldyBVUkwodXJsU3RyaW5nKTsKLSAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBVUkxDb25uZWN0aW9uIHVybENvbjsKLSAgICAgICAgICAgICAgICB1cmxDb24gPSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKLSAgICAgICAgICAgICAgICAvLyBUT0RPIGhhbmRsZSB0aGUgSFRUUFMgc2NlbmFyaW8gYXMgd2VsbC4gCi0gICAgICAgICAgICAgICAgaWYgKHVybENvbiBpbnN0YW5jZW9mIEh0dHBVUkxDb25uZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgCUh0dHBVUkxDb25uZWN0aW9uIGh0dHBDb24gPSAoSHR0cFVSTENvbm5lY3Rpb24pdXJsQ29uOwotICAgICAgICAgICAgICAgICAgICBodHRwQ29uLnNldERvT3V0cHV0KHRydWUpOwotICAgICAgICAgICAgICAgICAgICBodHRwQ29uLnNldERvSW5wdXQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGh0dHBDb24uc2V0VXNlQ2FjaGVzKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgaHR0cENvbi5zZXRSZXF1ZXN0TWV0aG9kKCJHRVQiKTsKLSAgICAgICAgICAgICAgICAgICAgSHR0cFVSTENvbm5lY3Rpb24uc2V0Rm9sbG93UmVkaXJlY3RzKHRydWUpOyAgCi0gICAgICAgICAgICAgICAgICAgIGh0dHBDb24uc2V0UmVhZFRpbWVvdXQodGltZVRPUmV0cmlldmVXU0RMKTsKLSAgICAgICAgICAgICAgICAgICAgaHR0cENvbi5jb25uZWN0KCk7ICAvLyB0cnkgdG8gY29ubmVjdCB0byBXU0RMCi0gICAgICAgICAgICAgICAgICAgIGh0dHBDb24uZGlzY29ubmVjdCgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIERvIG5vdGhpbmcgCi0JCQkJCS8vIEFzc3VtZSB0aGF0IHRoaXMgaXMgaW4gdGhlIGxvY2FsIGZpbGUgc3lzdGVtCi0JCQkJfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGlmKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQgPj0gdGltZVRPUmV0cmlldmVXU0RMKXsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKEF4aXMyQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkVSUk9SX1dTRExfUElOR19USU1FX09VVCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgV1NETCByZWFkIHRpbWVvdXQgCi0JICogQHBhcmFtIHRpbWVUT1JldHJpZXZlV1NETCAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUaW1lVE9SZXRyaWV2ZVdTREwoaW50IHRpbWVUT1JldHJpZXZlV1NETCkgewotCQl0aGlzLnRpbWVUT1JldHJpZXZlV1NETCA9IHRpbWVUT1JldHJpZXZlV1NETDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb25zdW1wdGlvbi9jb3JlL3V0aWxzL1dTREwySmF2YUdlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NvbnN1bXB0aW9uL2NvcmUvdXRpbHMvV1NETDJKYXZhR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNWM4NmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NvbnN1bXB0aW9uL2NvcmUvdXRpbHMvV1NETDJKYXZhR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBXU08yIEluYy4gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogV1NPMiBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDcwMTE4ICAgMTY4NzYyIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgY29kZSB0byBpbnRyb2R1c2UgdGhlIEF4aXMyIAotICogCQkJCQkJCQkJCSAgcnVudGltZSB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjIKLSAqIDIwMDcwNDI2ICAgMTgzMDQ2IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgKLSAqIDIwMDcwNTA3ICAgMTg0NzI5IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS51dGlsczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS51dGlscy5DbGFzc0xvYWRpbmdVdGlsOwotCi1wdWJsaWMgY2xhc3MgV1NETDJKYXZhR2VuZXJhdG9yIHsKLQkKLSAgICAvKioKLSAgICAgKiBNYXBzIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgYSBsYW5ndWFnZSB0byBhIGNvbnN0YW50IGRlZmluZWQgaW4gCi0gICAgICogQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuTGFuZ3VhZ2VOYW1lcwotICAgICAqIEBwYXJhbSBVSUxhbmdWYWx1ZSBhIHN0cmluZyBjb250YWluZyBhIGxhbmd1YWdlLCBlLmcuICJqYXZhIiwgImNzIiwgImNwcCIgb3IgInZiIgotICAgICAqIEByZXR1cm4gYSBub3JtYWxpemVkIHN0cmluZyBjb25zdGFudAotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIG1hcExhbmd1YWdlc1dpdGhDb21ibyhTdHJpbmcgVUlMYW5nVmFsdWUpICB7Ci0gICAgICAgcmV0dXJuIFVJTGFuZ1ZhbHVlOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbGlzdCBvZiBwYXJhbWV0ZXJzIGZvciB0aGUgY29kZSBnZW5lcmF0b3IgYmFzZWQgb24gdGhlIGRlY2lzaW9ucyBtYWRlIGJ5IAotICAgICAqIHRoZSB1c2VyIG9uIHRoZSBPcHRpb25zUGFnZShwYWdlMikuIEZvciBlYWNoIHNldHRpbmcsIHRoZXJlIGlzIGEgQ29tbWFuZC1MaW5lIG9wdGlvbiBmb3IgCi0gICAgICogdGhlIEF4aXMyIGNvZGUgZ2VuZXJhdG9yLgotICAgICAqIEByZXR1cm4gYSBNYXAgd2l0aCBrZXlzIGZyb20gQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMgd2l0aCB0aGUgdmFsdWVzIGVudGVyZWQgCi0gICAgICogYnkgdGhlIHVzZXIgb24gdGhlIE9wdGlvbnMgUGFnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwIGZpbGxPcHRpb25NYXAoYm9vbGVhbiBpc0F5bmNPbmx5LAotICAgICAgICAgICAgCQkgIGJvb2xlYW4gaXNTeW5jT25seSwKLSAgICAgICAgICAgIAkJICBib29sZWFuIGlzU2VydmVyU2lkZSwKLSAgICAgICAgICAgIAkJICBib29sZWFuIGlzU2VydmVyWE1MLAotICAgICAgICAgICAgCQkgIGJvb2xlYW4gaXNUZXN0Q2FzZSwKLSAgICAgICAgICAgIAkJICBib29sZWFuIGlzR2VuZXJhdGVBbGwsCi0gICAgICAgICAgICAJCSAgU3RyaW5nIHNlcnZpY2VOYW1lLAotICAgICAgICAgICAgCQkgIFN0cmluZyBwb3J0TmFtZSwKLSAgICAgICAgICAgIAkJICBTdHJpbmcgZGF0YWJpbmRpbmdOYW1lLAotICAgICAgICAgICAgCQkgIFN0cmluZyBXU0RMVVJJLAotICAgICAgICAgICAgCQkgIFN0cmluZyBwYWNrYWdlTmFtZSwKLSAgICAgICAgICAgIAkJICBTdHJpbmcgc2VsZWN0ZWRMYW5ndWFnZSwKLSAgICAgICAgICAgIAkJICBTdHJpbmcgb3V0cHV0TG9jYXRpb24sCi0gICAgICAgICAgICAJCSAgU3RyaW5nIG5hbWVzcGFjZTJwYWNrYWdlTGlzdCwKLSAgICAgICAgICAgIAkJICBib29sZWFuIGlzU2VydmVyU2lkZUludGVyZmFjZQotICAgICAgICAgICAgCQkgICl7Ci0gICAgICAgTWFwIG9wdGlvbk1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgCi0gICAgIHRyeXsgIAotICAgICAgICAvL1JlZmxlY3Rpb24gaW52b2NhdGluIHJlc291cmNlcwotCQlDbGFzcyBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50c0NsYXNzID0gQ2xhc3NMb2FkaW5nVXRpbC5sb2FkQ2xhc3NGcm9tQW50Q2xhc3NMb2FkZXIoCi0JCQkJCQkJIm9yZy5hcGFjaGUuYXhpczIudXRpbC5Db21tYW5kTGluZU9wdGlvbkNvbnN0YW50cyRXU0RMMkphdmFDb25zdGFudHMiKTsKLQkJQ2xhc3MgQ29tbWFuZExpbmVPcHRpb25DbGFzcyA9IENsYXNzTG9hZGluZ1V0aWwubG9hZENsYXNzRnJvbUFudENsYXNzTG9hZGVyKAotCQkJCQkJCQkJCQkJCQkib3JnLmFwYWNoZS5heGlzMi51dGlsLkNvbW1hbmRMaW5lT3B0aW9uIik7Ci0JCUNvbnN0cnVjdG9yIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RydWN0b3IgPSBDb21tYW5kTGluZU9wdGlvbkNsYXNzLmdldENvbnN0cnVjdG9yKAotCQkJCQkJCQkJCQkJCQluZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3MsU3RyaW5nW10uY2xhc3N9KTsKLSAgICAgICAgLy9XU0RMIGZpbGUgbmFtZQotICAgICAgIAotCQkJCQkJCS8vICAgICAgIG9wdGlvbk1hcC5wdXQoQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLldTRExfTE9DQVRJT05fVVJJX09QVElPTiwgCi0JCQkJCQkJLy8gICAgCQkgICAJCSBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0JCQkJCQkJLy8gICAgCQkgICAJCQkJIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5XU0RMX0xPQ0FUSU9OX1VSSV9PUFRJT04sCi0JCQkJCQkJLy8gICAgCQkgICAJCQkJIGdldFN0cmluZ0FycmF5KFdTRExVUkkpKSk7Ci0JCQotICAgICAgICAvL1JlZmxlY3Rpb24gSW52b2NhdGlvbiAKLQkJRmllbGQgV1NETF9MT0NBVElPTl9VUklfT1BUSU9OX0ZJRUxEID0gQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHNDbGFzcy5nZXRGaWVsZCgKLQkJCQkJCQkJCQkJCQkJCQkJCSJXU0RMX0xPQ0FUSU9OX1VSSV9PUFRJT04iKTsKLQkJb3B0aW9uTWFwLnB1dCgoU3RyaW5nKVdTRExfTE9DQVRJT05fVVJJX09QVElPTl9GSUVMRC5nZXQoU3RyaW5nLmNsYXNzKSwKLQkJCQkJCUNvbW1hbmRMaW5lT3B0aW9uQ29uc3RydWN0b3IubmV3SW5zdGFuY2UoCi0JCQkJCQkJbmV3IE9iamVjdFtdeyhTdHJpbmcpV1NETF9MT0NBVElPTl9VUklfT1BUSU9OX0ZJRUxELmdldChTdHJpbmcuY2xhc3MpLAotCQkJCQkJCWdldFN0cmluZ0FycmF5KFdTRExVUkkpfSkpOwotICAgICAgIAotICAgICAgIC8vQXN5bmMgb25seQotICAgICAgIGlmIChpc0F5bmNPbmx5KQotICAgICAgIHsKLQkJCQkJCQkvLyAgICAgICAgICBvcHRpb25NYXAucHV0KENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5DT0RFR0VOX0FTWU5DX09OTFlfT1BUSU9OLCAKLQkJCQkJCQkvLyAgICAgICAgCQkgIAluZXcgQ29tbWFuZExpbmVPcHRpb24oCi0JCQkJCQkJLy8gICAgICAgIAkJICAJCQlDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuQ09ERUdFTl9BU1lOQ19PTkxZX09QVElPTiwKLQkJCQkJCQkvLyAgICAgICAgCQkgIAkJCW5ldyBTdHJpbmdbMF0pKTsKLSAgICAgICAgCi0gICAgCS8vUmVmbGVjdGlvbiBJbnZvY2F0aW9uICAgICAJICAgCi0gICAJCUZpZWxkIENPREVHRU5fQVNZTkNfT05MWV9PUFRJT05fRklFTEQgPSBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50c0NsYXNzCi0gICAJCQkJCQkJCQkJCQkuZ2V0RmllbGQoIkNPREVHRU5fQVNZTkNfT05MWV9PUFRJT04iKTsKLQkJb3B0aW9uTWFwLnB1dCgoU3RyaW5nKUNPREVHRU5fQVNZTkNfT05MWV9PUFRJT05fRklFTEQuZ2V0KAotCQkJCQkJU3RyaW5nLmNsYXNzKSwKLQkJCQkJCUNvbW1hbmRMaW5lT3B0aW9uQ29uc3RydWN0b3IubmV3SW5zdGFuY2UoCi0JCQkJCQkJbmV3IE9iamVjdFtdeyhTdHJpbmcpQ09ERUdFTl9BU1lOQ19PTkxZX09QVElPTl9GSUVMRC5nZXQoU3RyaW5nLmNsYXNzKSwKLQkJCQkJCQluZXcgU3RyaW5nWzBdfSkpOwotICAgICAgIH0KLSAgICAgICAKLSAgICAgICAvL3N5bmMgb25seQotICAgICAgIGlmIChpc1N5bmNPbmx5KQotICAgICAgIHsKLQkJCQkJCQkvLyAgICAgICAgICBvcHRpb25NYXAucHV0KENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5DT0RFR0VOX1NZTkNfT05MWV9PUFRJT04sIAotCQkJCQkJCS8vICAgICAgICAJCSAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotCQkJCQkJCS8vICAgICAgICAJCSAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkNPREVHRU5fU1lOQ19PTkxZX09QVElPTiwKLQkJCQkJCQkvLyAgICAgICAgCQkgIG5ldyBTdHJpbmdbMF0pKTsKLSAgICAgICAvL1JlZmxlY3Rpb24gSW52b2NhdGlvbgotICAgICAgCQlGaWVsZCBDT0RFR0VOX1NZTkNfT05MWV9PUFRJT05fRklFTEQgPSBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50c0NsYXNzCi0gICAgICAJCQkJCQkJCQkJCQkuZ2V0RmllbGQoIkNPREVHRU5fU1lOQ19PTkxZX09QVElPTiIpOwotICAgIAkJb3B0aW9uTWFwLnB1dCgoU3RyaW5nKUNPREVHRU5fU1lOQ19PTkxZX09QVElPTl9GSUVMRC5nZXQoU3RyaW5nLmNsYXNzKSwKLQkJCQkJQ29tbWFuZExpbmVPcHRpb25Db25zdHJ1Y3Rvci5uZXdJbnN0YW5jZSgKLQkJCQkJCQluZXcgT2JqZWN0W117KFN0cmluZylDT0RFR0VOX1NZTkNfT05MWV9PUFRJT05fRklFTEQuZ2V0KFN0cmluZy5jbGFzcyksCi0JCQkJCQkJbmV3IFN0cmluZ1swXX0pKTsKLSAgICAgICB9Ci0gICAgICAgLy9zZXJ2ZXJzaWRlCi0gICAgICAgaWYgKGlzU2VydmVyU2lkZSkKLSAgICAgICB7Ci0JCQkJCQkJLy8gICAgICAgICAgb3B0aW9uTWFwLnB1dChDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuU0VSVkVSX1NJREVfQ09ERV9PUFRJT04sIAotCQkJCQkJCS8vICAgICAgICAJCSAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotCQkJCQkJCS8vICAgICAgICAJCSAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlNFUlZFUl9TSURFX0NPREVfT1BUSU9OLAotCQkJCQkJCS8vICAgICAgICAJCSAgbmV3IFN0cmluZ1swXSkpOwotCSAgICAvL1JlZmxlY3Rpb24gSW52b2NhdGlvbgotCQlGaWVsZCBTRVJWRVJfU0lERV9DT0RFX09QVElPTl9GSUVMRCA9IENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzQ2xhc3MKLQkJCQkJCQkJCQkJCS5nZXRGaWVsZCgiU0VSVkVSX1NJREVfQ09ERV9PUFRJT04iKTsKLQkJb3B0aW9uTWFwLnB1dCgoU3RyaW5nKVNFUlZFUl9TSURFX0NPREVfT1BUSU9OX0ZJRUxELmdldChTdHJpbmcuY2xhc3MpLAotCQkJCUNvbW1hbmRMaW5lT3B0aW9uQ29uc3RydWN0b3IubmV3SW5zdGFuY2UoCi0JCQkJCQluZXcgT2JqZWN0W117KFN0cmluZylTRVJWRVJfU0lERV9DT0RFX09QVElPTl9GSUVMRC5nZXQoU3RyaW5nLmNsYXNzKSwKLQkJCQkJCW5ldyBTdHJpbmdbMF19KSk7Ci0gICAgICAgICAgLy9zZXJ2ZXIgeG1sCi0gICAgICAgICAgaWYgKGlzU2VydmVyWE1MKQotICAgICAgICAgIHsKLSAgICAgICAgICAvL29wdGlvbk1hcC5wdXQoCi0JCQkJCQkJLy8gICAgICAgICAgICAJCSBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuR0VORVJBVEVfU0VSVklDRV9ERVNDUklQVElPTl9PUFRJT04sCi0gICAgICAgICAgLy8gCW5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAvLyAJQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkdFTkVSQVRFX1NFUlZJQ0VfREVTQ1JJUFRJT05fT1BUSU9OLAotCQkJCQkJCS8vICAgICAgICAgICAgCQkgbmV3IFN0cmluZ1swXSkpOwotICAgICAgIAkJRmllbGQgR0VORVJBVEVfU0VSVklDRV9ERVNDUklQVElPTl9PUFRJT05fRklFTEQgPSBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50c0NsYXNzCi0gICAJCQkJCQkJCQkJCQkuZ2V0RmllbGQoIkdFTkVSQVRFX1NFUlZJQ0VfREVTQ1JJUFRJT05fT1BUSU9OIik7Ci0gICAgCQlvcHRpb25NYXAucHV0KChTdHJpbmcpR0VORVJBVEVfU0VSVklDRV9ERVNDUklQVElPTl9PUFRJT05fRklFTEQuZ2V0KFN0cmluZy5jbGFzcyksCi0JCQkJQ29tbWFuZExpbmVPcHRpb25Db25zdHJ1Y3Rvci5uZXdJbnN0YW5jZSgKLQkJCQkgICBuZXcgT2JqZWN0W117KFN0cmluZylHRU5FUkFURV9TRVJWSUNFX0RFU0NSSVBUSU9OX09QVElPTl9GSUVMRC5nZXQoU3RyaW5nLmNsYXNzKSwKLQkJCQkgICBuZXcgU3RyaW5nWzBdfSkpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoaXNHZW5lcmF0ZUFsbCl7Ci0JCQkJCQkJLy8gICAgICAgICAgICAgIG9wdGlvbk1hcC5wdXQoQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkdFTkVSQVRFX0FMTF9PUFRJT04sIAotCQkJCQkJCS8vICAgICAgICAgICAgCQkgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLQkJCQkJCQkvLyAgICAgICAgICAgIAkJICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuR0VORVJBVEVfQUxMX09QVElPTiwKLQkJCQkJCQkvLyAgICAgICAgICAgIAkJICBuZXcgU3RyaW5nWzBdKSk7Ci0JCQlGaWVsZCBHRU5FUkFURV9BTExfT1BUSU9OX0ZJRUxEID0gQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHNDbGFzcwotCQkJCQkJCQkJCQkJCQkuZ2V0RmllbGQoIkdFTkVSQVRFX0FMTF9PUFRJT04iKTsKLQkJCW9wdGlvbk1hcC5wdXQoKFN0cmluZylHRU5FUkFURV9BTExfT1BUSU9OX0ZJRUxELmdldChTdHJpbmcuY2xhc3MpLAotCQkJCQlDb21tYW5kTGluZU9wdGlvbkNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKAotCQkJCQkJCW5ldyBPYmplY3RbXXsoU3RyaW5nKUdFTkVSQVRFX0FMTF9PUFRJT05fRklFTEQuZ2V0KFN0cmluZy5jbGFzcyksCi0JCQkJCQkJbmV3IFN0cmluZ1swXX0pKTsKLSAgICAgICAgICB9Ci0gICAgICAgfQotICAgICAgIC8vdGVzdCBjYXNlCi0gICAgICAgaWYgKGlzVGVzdENhc2UpCi0gICAgICAgewotCQkJCQkJCS8vICAgICAgICAgIG9wdGlvbk1hcC5wdXQoQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkdFTkVSQVRFX1RFU1RfQ0FTRV9PUFRJT04sCi0JCQkJCQkJLy8gICAgICAgIAkJICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0JCQkJCQkJLy8gICAgICAgIAkJICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuR0VORVJBVEVfVEVTVF9DQVNFX09QVElPTiwKLQkJCQkJCQkvLyAgICAgICAgCQkgIG5ldyBTdHJpbmdbMF0pKTsKLQkJRmllbGQgR0VORVJBVEVfVEVTVF9DQVNFX09QVElPTl9GSUVMRCA9IENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzQ2xhc3MKLQkJCQkJCQkJCQkJCQkuZ2V0RmllbGQoIkdFTkVSQVRFX1RFU1RfQ0FTRV9PUFRJT04iKTsKLQkJb3B0aW9uTWFwLnB1dCgoU3RyaW5nKUdFTkVSQVRFX1RFU1RfQ0FTRV9PUFRJT05fRklFTEQuZ2V0KFN0cmluZy5jbGFzcyksCi0JCQkJQ29tbWFuZExpbmVPcHRpb25Db25zdHJ1Y3Rvci5uZXdJbnN0YW5jZSgKLQkJCQkJCW5ldyBPYmplY3RbXXsoU3RyaW5nKUdFTkVSQVRFX1RFU1RfQ0FTRV9PUFRJT05fRklFTEQuZ2V0KFN0cmluZy5jbGFzcyksCi0JCQkJCQluZXcgU3RyaW5nWzBdfSkpOwotICAgICAgIH0KLSAgICAgICAvL3BhY2thZ2UgbmFtZQotCQkJCQkJCS8vICAgICAgIG9wdGlvbk1hcC5wdXQoQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlBBQ0tBR0VfT1BUSU9OLAotCQkJCQkJCS8vICAgIAkJICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotCQkJCQkJCS8vICAgIAkJICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlBBQ0tBR0VfT1BUSU9OLAotCQkJCQkJCS8vICAgIAkJICAgZ2V0U3RyaW5nQXJyYXkocGFja2FnZU5hbWUpKSk7Ci0gCQlGaWVsZCBQQUNLQUdFX09QVElPTl9GSUVMRCA9IENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzQ2xhc3MuZ2V0RmllbGQoIlBBQ0tBR0VfT1BUSU9OIik7Ci0JCW9wdGlvbk1hcC5wdXQoKFN0cmluZylQQUNLQUdFX09QVElPTl9GSUVMRC5nZXQoU3RyaW5nLmNsYXNzKSwKLQkJCQkJCQlDb21tYW5kTGluZU9wdGlvbkNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKAotCQkJCQkJCQkJbmV3IE9iamVjdFtdeyhTdHJpbmcpUEFDS0FHRV9PUFRJT05fRklFTEQuZ2V0KFN0cmluZy5jbGFzcyksCi0JCQkJCQkJCQlnZXRTdHJpbmdBcnJheShwYWNrYWdlTmFtZSl9KSk7Ci0JCQotICAgICAgIC8vc2VsZWN0ZWQgbGFuZ3VhZ2UKLQkJCQkJCQkvLyAgICAgICBvcHRpb25NYXAucHV0KENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5TVFVCX0xBTkdVQUdFX09QVElPTiwKLQkJCQkJCQkvLyAgICAJCSAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLQkJCQkJCQkvLyAgICAJCSAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5TVFVCX0xBTkdVQUdFX09QVElPTiwKLQkJCQkJCQkvLyAgICAJCSAgIGdldFN0cmluZ0FycmF5KG1hcExhbmd1YWdlc1dpdGhDb21ibyhzZWxlY3RlZExhbmd1YWdlKSkpKTsKLSAJCUZpZWxkIFNUVUJfTEFOR1VBR0VfT1BUSU9OX0ZJRUxEID0gQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHNDbGFzcwotIAkJCQkJCQkJCQkJCQkJCS5nZXRGaWVsZCgiU1RVQl9MQU5HVUFHRV9PUFRJT04iKTsKLQkJb3B0aW9uTWFwLnB1dCgoU3RyaW5nKVNUVUJfTEFOR1VBR0VfT1BUSU9OX0ZJRUxELmdldChTdHJpbmcuY2xhc3MpLAotCQkJCQkJCUNvbW1hbmRMaW5lT3B0aW9uQ29uc3RydWN0b3IubmV3SW5zdGFuY2UoCi0JCQkJCQkJCW5ldyBPYmplY3RbXXsoU3RyaW5nKVNUVUJfTEFOR1VBR0VfT1BUSU9OX0ZJRUxELmdldChTdHJpbmcuY2xhc3MpLAotCQkJCQkJCQlnZXRTdHJpbmdBcnJheShtYXBMYW5ndWFnZXNXaXRoQ29tYm8oc2VsZWN0ZWRMYW5ndWFnZSkpfSkpOwotCQkKLSAgICAgICAvL291dHB1dCBsb2NhdGlvbgotCQkJCQkJCS8vICAgICAgIG9wdGlvbk1hcC5wdXQoQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLk9VVFBVVF9MT0NBVElPTl9PUFRJT04sCi0JCQkJCQkJLy8gICAgCQkgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0JCQkJCQkJLy8gICAgCQkgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuT1VUUFVUX0xPQ0FUSU9OX09QVElPTiwKLQkJCQkJCQkvLyAgICAJCSAgIGdldFN0cmluZ0FycmF5KG91dHB1dExvY2F0aW9uKSkpOwotIAkJRmllbGQgT1VUUFVUX0xPQ0FUSU9OX09QVElPTl9GSUVMRCA9IENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzQ2xhc3MKLSAJCQkJCQkJCQkJCQkJCS5nZXRGaWVsZCgiT1VUUFVUX0xPQ0FUSU9OX09QVElPTiIpOwotCQlvcHRpb25NYXAucHV0KChTdHJpbmcpT1VUUFVUX0xPQ0FUSU9OX09QVElPTl9GSUVMRC5nZXQoU3RyaW5nLmNsYXNzKSwKLQkJCQkJCQlDb21tYW5kTGluZU9wdGlvbkNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKAotCQkJCQkJCQluZXcgT2JqZWN0W117KFN0cmluZylPVVRQVVRfTE9DQVRJT05fT1BUSU9OX0ZJRUxELmdldChTdHJpbmcuY2xhc3MpLAotCQkJCQkJCQlnZXRTdHJpbmdBcnJheShvdXRwdXRMb2NhdGlvbil9KSk7Ci0gICAgICAgCi0gICAgICAvL2RhdGFiaW5kaW5nCi0JCQkJCQkJLy8gICAgICAgb3B0aW9uTWFwLnB1dChDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuREFUQV9CSU5ESU5HX1RZUEVfT1BUSU9OLAotCQkJCQkJCS8vICAgIAkJICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotCQkJCQkJCS8vICAgIAkJICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkRBVEFfQklORElOR19UWVBFX09QVElPTiwKLQkJCQkJCQkvLyAgICAJCSAgIGdldFN0cmluZ0FycmF5KGRhdGFiaW5kaW5nTmFtZSkpKTsKLSAJCUZpZWxkIERBVEFfQklORElOR19UWVBFX09QVElPTl9GSUVMRCA9IENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzQ2xhc3MKLSAJCQkJCQkJCQkJCQkJLmdldEZpZWxkKCJEQVRBX0JJTkRJTkdfVFlQRV9PUFRJT04iKTsKLQkJb3B0aW9uTWFwLnB1dCgoU3RyaW5nKURBVEFfQklORElOR19UWVBFX09QVElPTl9GSUVMRC5nZXQoU3RyaW5nLmNsYXNzKSwKLQkJCQkJCQlDb21tYW5kTGluZU9wdGlvbkNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKAotCQkJCQkJCSAgbmV3IE9iamVjdFtdeyhTdHJpbmcpREFUQV9CSU5ESU5HX1RZUEVfT1BUSU9OX0ZJRUxELmdldChTdHJpbmcuY2xhc3MpLAotCQkJCQkJCSAgZ2V0U3RyaW5nQXJyYXkoZGF0YWJpbmRpbmdOYW1lKX0pKTsKLSAgICAgICAKLSAgICAgICAvL3BvcnQgbmFtZQotICAgICAgIGlmIChwb3J0TmFtZSE9bnVsbCl7Ci0JCQkJCQkJLy8JICAgICAgIG9wdGlvbk1hcC5wdXQoQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlBPUlRfTkFNRV9PUFRJT04sCi0JCQkJCQkJLy8JICAgIAkJICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotCQkJCQkJCS8vCSAgICAJCSAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5QT1JUX05BTUVfT1BUSU9OLAotCQkJCQkJCS8vCSAgICAJCSAgIGdldFN0cmluZ0FycmF5KHBvcnROYW1lKSkpOwotICAgICAJCUZpZWxkIFBPUlRfTkFNRV9PUFRJT05fRklFTEQgPSBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50c0NsYXNzCi0gICAgIAkJCQkJCQkJCQkJCQkJLmdldEZpZWxkKCJQT1JUX05BTUVfT1BUSU9OIik7Ci0gICAgCQlvcHRpb25NYXAucHV0KChTdHJpbmcpUE9SVF9OQU1FX09QVElPTl9GSUVMRC5nZXQoU3RyaW5nLmNsYXNzKSwKLSAgICAJCQkJCQlDb21tYW5kTGluZU9wdGlvbkNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKAotICAgIAkJCQkJCQkJbmV3IE9iamVjdFtdeyhTdHJpbmcpUE9SVF9OQU1FX09QVElPTl9GSUVMRC5nZXQoU3RyaW5nLmNsYXNzKSwKLSAgICAJCQkJCQkJCWdldFN0cmluZ0FycmF5KHBvcnROYW1lKX0pKTsKLSAgICAgICB9Ci0gICAgICAgLy9zZXJ2aWNlIG5hbWUKLSAgICAgICBpZiAoc2VydmljZU5hbWUhPSBudWxsKXsKLQkJCQkJCQkvLwkgICAgICAgb3B0aW9uTWFwLnB1dChDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuU0VSVklDRV9OQU1FX09QVElPTiwKLQkJCQkJCQkvLwkgICAgCQkgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0JCQkJCQkJLy8JICAgIAkJICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlNFUlZJQ0VfTkFNRV9PUFRJT04sCi0JCQkJCQkJLy8JICAgIAkJICAgZ2V0U3RyaW5nQXJyYXkoc2VydmljZU5hbWUpKSk7Ci0gICAgIAkJRmllbGQgU0VSVklDRV9OQU1FX09QVElPTl9GSUVMRCA9IENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzQ2xhc3MKLSAgICAgCQkJCQkJCQkJCQkJCS5nZXRGaWVsZCgiU0VSVklDRV9OQU1FX09QVElPTiIpOwotICAgIAkJb3B0aW9uTWFwLnB1dCgoU3RyaW5nKVNFUlZJQ0VfTkFNRV9PUFRJT05fRklFTEQuZ2V0KFN0cmluZy5jbGFzcyksCi0gICAgCQkJCQlDb21tYW5kTGluZU9wdGlvbkNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKAotICAgIAkJCQkJCQluZXcgT2JqZWN0W117KFN0cmluZylTRVJWSUNFX05BTUVfT1BUSU9OX0ZJRUxELmdldChTdHJpbmcuY2xhc3MpLAotICAgIAkJCQkJCQkJCWdldFN0cmluZ0FycmF5KHNlcnZpY2VOYW1lKX0pKTsKLSAgICAgICB9Ci0gICAgICAgLy9uczJwa2cgbWFwcGluZwotICAgICAgIGlmIChuYW1lc3BhY2UycGFja2FnZUxpc3QhPSBudWxsKXsKLQkJCQkJCQkvLwkgICAgICAgb3B0aW9uTWFwLnB1dChDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuTkFNRV9TUEFDRV9UT19QQUNLQUdFX09QVElPTiwKLQkJCQkJCQkvLwkgICAgCQkgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0JCQkJCQkJLy8JICAgIAkJICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLk5BTUVfU1BBQ0VfVE9fUEFDS0FHRV9PUFRJT04KLQkJCQkJCQkvLwkgICAgCQkgICAsIGdldFN0cmluZ0FycmF5KG5hbWVzcGFjZTJwYWNrYWdlTGlzdCkpKTsKLSAgICAgCQlGaWVsZCBOQU1FX1NQQUNFX1RPX1BBQ0tBR0VfT1BUSU9OX0ZJRUxEID0gQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHNDbGFzcwotICAgICAJCQkJCQkJCQkJCS5nZXRGaWVsZCgiTkFNRV9TUEFDRV9UT19QQUNLQUdFX09QVElPTiIpOwotICAgIAkJb3B0aW9uTWFwLnB1dCgoU3RyaW5nKU5BTUVfU1BBQ0VfVE9fUEFDS0FHRV9PUFRJT05fRklFTEQuZ2V0KFN0cmluZy5jbGFzcyksCi0gICAgCQkJCUNvbW1hbmRMaW5lT3B0aW9uQ29uc3RydWN0b3IubmV3SW5zdGFuY2UoCi0gICAgCQkJCQluZXcgT2JqZWN0W117KFN0cmluZylOQU1FX1NQQUNFX1RPX1BBQ0tBR0VfT1BUSU9OX0ZJRUxELmdldChTdHJpbmcuY2xhc3MpLAotICAgIAkJCQkJZ2V0U3RyaW5nQXJyYXkobmFtZXNwYWNlMnBhY2thZ2VMaXN0KX0pKTsKLSAgICAgICB9Ci0gICAgICAgCi0gICAgICAgLy9zZXJ2ZXIgc2lkZSBpbnRlcmZhY2UgIG1hcHBpbmcKLSAgICAgICBpZiAoaXNTZXJ2ZXJTaWRlSW50ZXJmYWNlKXsKLQkJCQkJCQkvLwkgICAgICAgb3B0aW9uTWFwLnB1dChDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuU0VSVkVSX1NJREVfSU5URVJGQUNFX09QVElPTiwKLQkJCQkJCQkvLwkgICAgCQkgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0JCQkJCQkJLy8JICAgIAkJICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlNFUlZFUl9TSURFX0lOVEVSRkFDRV9PUFRJT04sCi0JCQkJCQkJLy8JICAgIAkJICAgbmV3IFN0cmluZ1swXSkpOwotICAgICAJCUZpZWxkIFNFUlZFUl9TSURFX0lOVEVSRkFDRV9PUFRJT05fRklFTEQgPSBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50c0NsYXNzCi0gICAgIAkJCQkJCQkJCQkJLmdldEZpZWxkKCJTRVJWRVJfU0lERV9JTlRFUkZBQ0VfT1BUSU9OIik7Ci0gICAgCQlvcHRpb25NYXAucHV0KChTdHJpbmcpU0VSVkVSX1NJREVfSU5URVJGQUNFX09QVElPTl9GSUVMRC5nZXQoU3RyaW5nLmNsYXNzKSwKLSAgICAJCQkJQ29tbWFuZExpbmVPcHRpb25Db25zdHJ1Y3Rvci5uZXdJbnN0YW5jZSgKLSAgICAJCQkJCW5ldyBPYmplY3RbXXsoU3RyaW5nKVNFUlZFUl9TSURFX0lOVEVSRkFDRV9PUFRJT05fRklFTEQuZ2V0KFN0cmluZy5jbGFzcyksCi0gICAgCQkJCQluZXcgU3RyaW5nWzBdfSkpOwotICAgICAgIH0KLSAgICAgICAKLSAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsKLSAgICAJIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgIH0KLSAgICAgICByZXR1cm4gb3B0aW9uTWFwOwotICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldEJhc2VVcmkoU3RyaW5nIHdzZGxVUkkpewotICAgIAkKLSAgICAJdHJ5IHsKLQkJCVVSTCB1cmw7Ci0JCQlpZiAod3NkbFVSSS5pbmRleE9mKCI6Ly8iKT09LTEpewotCQkJCXVybCA9IG5ldyBVUkwoImZpbGUiLCIiLHdzZGxVUkkpOwotCQkJfWVsc2V7Ci0JCQkJdXJsID0gbmV3IFVSTCh3c2RsVVJJKTsJCi0JCQl9Ci0KLQkJCQotCQkJU3RyaW5nIGJhc2VVcmk7Ci0JCQlpZiAoImZpbGUiLmVxdWFscyh1cmwuZ2V0UHJvdG9jb2woKSkpewotCQkJCWJhc2VVcmkgPSBuZXcgRmlsZSh1cmwuZ2V0RmlsZSgpKS5nZXRQYXJlbnRGaWxlKCkudG9VUkwoKS50b0V4dGVybmFsRm9ybSgpOwotCQkJfWVsc2V7Ci0JCQkJYmFzZVVyaSA9IHVybC50b0V4dGVybmFsRm9ybSgpLnN1YnN0cmluZygwLAotCQkJCQkJdXJsLnRvRXh0ZXJuYWxGb3JtKCkubGFzdEluZGV4T2YoIi8iKQotCQkJCSk7Ci0JCQl9Ci0JCQotCQkJCi0JCQlyZXR1cm4gYmFzZVVyaTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotCQl9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJlYWRzIHRoZSBXU0RMIE9iamVjdCBNb2RlbCBmcm9tIHRoZSBnaXZlbiBsb2NhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gd3NkbFVSSSB0aGUgZmlsZXN5c3RlbSBsb2NhdGlvbiAoZnVsbCBwYXRoKSBvZiB0aGUgV1NETCBmaWxlIHRvIHJlYWQgaW4uCi0gICAgICogQHJldHVybiB0aGUgV1NETERlc2NyaXB0aW9uIG9iamVjdCBjb250YWluaW5nIHRoZSBXU0RMIE9iamVjdCBNb2RlbCBvZiB0aGUgZ2l2ZW4gV1NETCBmaWxlCi0gICAgICogQHRocm93cyBXU0RMRXhjZXB0aW9uIHdoZW4gV1NETCBGaWxlIGlzIGludmFsaWQKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIG9uIGVycm9ycyByZWFkaW5nIHRoZSBXU0RMIGZpbGUKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEF4aXNTZXJ2aWNlKFN0cmluZyB3c2RsVVJJKSB0aHJvd3MgRXhjZXB0aW9uewotICAgIAkKLSAgICAJCVVSTCB1cmw7Ci0JCQlpZiAod3NkbFVSSS5pbmRleE9mKCI6Ly8iKT09LTEpewotCQkJCXVybCA9IG5ldyBVUkwoImZpbGUiLCIiLHdzZGxVUkkpOwotCQkJfWlmICh3c2RsVVJJLmluZGV4T2YoIjovIik9PS0xKXsKLQkJCQl1cmwgPSBuZXcgVVJMKCJmaWxlIiwiIix3c2RsVVJJKTsKLQkJCX0KLQkJCWVsc2V7Ci0JCQkJdXJsID0gbmV3IFVSTCh3c2RsVVJJKTsJCi0JCQl9Ci0KLQkJCS8vRklYTUUgQGF1dGhvciBzb2kgLSAKLQkJICAgIC8vIFRoaXMgcXVpY2sgZml4IGFzc3VtZSB0aGF0IHRoZSB3c2RsVVJJIHBvaW50cyB0byBhIHdzZGwgMS4xIHZlcnNpb24uCi0JCQkvLyBBIGJldHRlciBmaXggc2hvdWxkIGJlIHRvIGRldGVybWluZSB3aGljaCBidWlsZGVyIHRvIHVzZSBiYXNlZCBvbiB0aGUgd3NkbCB2ZXJzaW9uLiAKLQkJCS8vIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIHRoZSB3c2RsIGJ1aWxkZXIgY2xhc3NlcyBkaWQgbm90IGFsbG93IGZvciB0aGlzLiAKLQkJCS8vIEkgd2lsbCBzdWdnZXN0dGhhdCB0aGUgZGV0ZXJtaW5hdGlvbiBvZiB3aGljaCBidWlsZGVyIHRvIHVzZSBzaG91bGQgYmUgZG9uZSBpbgotCQkJLy8gdGhlIGJ1aWxkZXIgY2xhc3NlcywgcHJlZmVyYWJseSBpbiB0aGUgcGFyZW50IGJ1aWxkZXIgY2xhc3MuIEFjY2Vzc2FibGUgdGhyb3VnaCBhCi0JCQkvLyBzdGF0aWMgcmVmZXJlbmNlIHRvIGEgbWV0aG9kIGxpa2UgZ2V0QnVpbGRlckluc3RhbmNlKFN0cmluZyB3c2RsVVJJKSBpbiB0aGUgcGFyZW50Ci0JCQkvL2J1aWxkZXIgY2xhc3Mgb3IgdGhyb3VnaCBhIGJ1aWxkZXIgQWJzdHJhY3QgRmFjdG9yIG9yIEFic3RyYWN0IGZhY3RvcnkgbWV0aG9kcy4KLQkJCQotCQkJCi0JCQkvL1dTREwxMVRvQXhpc1NlcnZpY2VCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXIoCi0JCQkvLwkJCQkJCQkJCQkJdXJsLm9wZW5Db25uZWN0aW9uKCkuZ2V0SW5wdXRTdHJlYW0oKSk7Ci0JCQkJCQkJLy8JCQlidWlsZGVyLnNldEJhc2VVcmkoZ2V0QmFzZVVyaSh3c2RsVVJJKSk7Ci0JCQkJCQkJLy8JCQlyZXR1cm4gYnVpbGRlci5wb3B1bGF0ZVNlcnZpY2UoKTsKLQkJCQotCQkJLy9SZWZsZWN0aW9uIGludm9jYXRpb24KLQkJCS8vQ2xhc3MgV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXJDbGFzcyA9IENsYXNzTG9hZGluZ1V0aWwubG9hZENsYXNzRnJvbUF4aXMyTGliUGF0aCgKLQkJCS8vICAgICAgICAgICAgICAgIHByb2plY3ROYW1lLAotCQkJLy8gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXIiKTsKLQkJCQotCQkJQ2xhc3MgV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXJDbGFzcyA9IENsYXNzTG9hZGluZ1V0aWwubG9hZENsYXNzRnJvbUFudENsYXNzTG9hZGVyKAotCQkJCQkib3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5XU0RMMTFUb0F4aXNTZXJ2aWNlQnVpbGRlciIpOwotCQkJQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSBXU0RMMTFUb0F4aXNTZXJ2aWNlQnVpbGRlckNsYXNzLmdldENvbnN0cnVjdG9yKAotCQkJCQluZXcgQ2xhc3NbXXtJbnB1dFN0cmVhbS5jbGFzc30pOwotCQkJT2JqZWN0IFdTREwxMVRvQXhpc1NlcnZpY2VCdWlsZGVySW5zdGFuY2UgPSBjb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZSgKLQkJCQkJbmV3IE9iamVjdFtde3VybC5vcGVuQ29ubmVjdGlvbigpLmdldElucHV0U3RyZWFtKCl9KTsKLQkJCU1ldGhvZCBzZXRCYXNlVXJpTWV0aG9kID0gV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXJDbGFzcy5nZXRNZXRob2QoCi0JCQkJCSJzZXRCYXNlVXJpIiwgCi0JCQkJCW5ldyBDbGFzc1tde1N0cmluZy5jbGFzc30pOwotCQkJc2V0QmFzZVVyaU1ldGhvZC5pbnZva2UoCi0JCQkJCVdTREwxMVRvQXhpc1NlcnZpY2VCdWlsZGVySW5zdGFuY2UsIAotCQkJCQluZXcgT2JqZWN0W117d3NkbFVSSX0pOwotCQkJCi0JCQkvL0ZpeCBmb3IgdGhlIEF4aXMyIDEuMiAKLQkJCS8vYnVpbGRlci5zZXRDb2RlZ2VuKHRydWUpOwotCQkJTWV0aG9kIHNldENvZGVnZW5NZXRob2QgPSBXU0RMMTFUb0F4aXNTZXJ2aWNlQnVpbGRlckNsYXNzLmdldE1ldGhvZCgKLQkJCQkJInNldENvZGVnZW4iLCAKLQkJCQkJbmV3IENsYXNzW117Ym9vbGVhbi5jbGFzc30pOwotCQkJc2V0Q29kZWdlbk1ldGhvZC5pbnZva2UoCi0JCQkJCVdTREwxMVRvQXhpc1NlcnZpY2VCdWlsZGVySW5zdGFuY2UsIAotCQkJCQluZXcgT2JqZWN0W117dHJ1ZX0pOwotCQkJCi0JCQlNZXRob2QgcG9wdWxhdGVTZXJ2aWNlTWV0aG9kID0gV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXJDbGFzcy5nZXRNZXRob2QoCi0JCQkJCSJwb3B1bGF0ZVNlcnZpY2UiLCAKLQkJCQkJbnVsbCk7Ci0JCQlyZXR1cm4gcG9wdWxhdGVTZXJ2aWNlTWV0aG9kLmludm9rZShXU0RMMTFUb0F4aXNTZXJ2aWNlQnVpbGRlckluc3RhbmNlLCBudWxsKTsKLQkJCQotCQkJLy9yZXR1cm4gdGhpcyBpbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhIHNpbmdsZSBTdHJpbmcgaW50byBhIFN0cmluZyBBcnJheQotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZSBhIHNpbmdsZSBzdHJpbmcKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgb25seSBvbmUgZWxlbWVudAotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nW10gZ2V0U3RyaW5nQXJyYXkoU3RyaW5nIHZhbHVlKQotICAgIHsKLSAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBuZXcgU3RyaW5nWzFdOwotICAgICAgIHZhbHVlc1swXSA9IHZhbHVlOwotICAgICAgIHJldHVybiB2YWx1ZXM7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29uc3VtcHRpb24vY29yZS91dGlscy9XU0RMUHJvcGVydHlSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb25zdW1wdGlvbi9jb3JlL3V0aWxzL1dTRExQcm9wZXJ0eVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWFhY2VjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb25zdW1wdGlvbi9jb3JlL3V0aWxzL1dTRExQcm9wZXJ0eVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDExOCAgIDE2ODc2MiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbml0aWFsIGNvZGUgdG8gaW50cm9kdXNlIHRoZSBBeGlzMiAKLSAqIAkJCQkJCQkJCQkgIHJ1bnRpbWUgdG8gdGhlIGZyYW1ld29yayBmb3IgMTY4NzYyCi0gKiAyMDA3MDQyNiAgIDE4MzA0NiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoCi0gKiAyMDA3MDUwNyAgIDE4NDcyOSBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS51dGlsczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS51dGlscy5DbGFzc0xvYWRpbmdVdGlsOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBwcmVzZW50cyBhIGNvbnZlbmllbnQgd2F5IG9mIHJlYWRpbmcgdGhlIAotICogV1NETCBmaWxlKHVybCkgYW5kIHByb2R1Y2luZyBhIHVzZWZ1bCBzZXQgb2YgaW5mb3JtYXRpb24KLSAqIEl0IGRvZXMgTk9UIHVzZSBhbnkgb2YgdGhlIHN0YW5kYXJkIFdTREwgY2xhc3NlcyBmcm9tIAotICogQXhpczIsIHJhdGhlciBpdCB1c2VzIHdzZGw0aiB0byByZWFkIHRoZSB3c2RsIGFuZCBleHRyYWN0IAotICogdGhlIHByb3BlcnRpZXMgKFRoaXMgaXMgbWVhbnQgYXMgYSBjb252ZW5pZW5jZSBmb3IgdGhlIFVJCi0gKiBvbmx5LiBXZSBtYXkgbm90IG5lZWQgdGhlIHdob2xlIGNvbnZlcnNpb24gdGhlIFdTRExwdW1wIAotICogZ29lcyB0aHJvdWdoKQotICogT25lIHdvdWxkIG5lZWQgdG8gY2hhbmdlIHRoaXMgdG8gc3VpdCBhIHByb3BlciBXU0RMIAotICovCi1wdWJsaWMgY2xhc3MgV1NETFByb3BlcnR5UmVhZGVyIHsKLQotCi0JLy9wcml2YXRlIERlZmluaXRpb24gd3NkbERlZmluaXRpb24gPSBudWxsOwotCXByaXZhdGUgT2JqZWN0IERlZmluaXRpb25JbnN0YW5jZSA9IG51bGw7Ci0JcHJpdmF0ZSBDbGFzcyBEZWZpbml0aW9uQ2xhc3MgPSBudWxsOwotCXByaXZhdGUgQ2xhc3MgU2VydmljZUNsYXNzID0gbnVsbDsKLQotCXB1YmxpYyB2b2lkIHJlYWRXU0RMKFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nIGZpbGVwYXRoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCUNsYXNzTG9hZGluZ1V0aWwuaW5pdChwcm9qZWN0TmFtZSk7Ci0JCQotCQlEZWZpbml0aW9uQ2xhc3MgPSBDbGFzc0xvYWRpbmdVdGlsLmxvYWRDbGFzc0Zyb21BbnRDbGFzc0xvYWRlcigiamF2YXgud3NkbC5EZWZpbml0aW9uIik7Ci0JCQotCQkvLwkJV1NETFJlYWRlciByZWFkZXIgPSBXU0RMRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1dTRExSZWFkZXIoKTsKLQkJLy8JCXdzZGxEZWZpbml0aW9uID0gcmVhZGVyLnJlYWRXU0RMKGZpbGVwYXRoKTsgCi0KLQkJQ2xhc3MgV1NETEZhY3RvcnlDbGFzcyA9IENsYXNzTG9hZGluZ1V0aWwKLQkJCQkubG9hZENsYXNzRnJvbUFudENsYXNzTG9hZGVyKCJqYXZheC53c2RsLmZhY3RvcnkuV1NETEZhY3RvcnkiKTsKLQkJTWV0aG9kIG5ld0luc3RhbmNlTWV0aG9kID0gV1NETEZhY3RvcnlDbGFzcy5nZXRNZXRob2QoIm5ld0luc3RhbmNlIiwgbnVsbCk7Ci0JCU9iamVjdCBXU0RMRmFjdG9yeU9iamVjdCA9IG5ld0luc3RhbmNlTWV0aG9kLmludm9rZShudWxsLCBudWxsKTsKLQkJQ2xhc3MgV1NETEZhY3RvcnlJbXBsQ2xhc3MgPSBDbGFzc0xvYWRpbmdVdGlsCi0JCQkJLmxvYWRDbGFzc0Zyb21BbnRDbGFzc0xvYWRlcihXU0RMRmFjdG9yeU9iamVjdC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0JCU1ldGhvZCBuZXdXU0RMUmVhZGVyTWV0aG9kID0gV1NETEZhY3RvcnlJbXBsQ2xhc3MuZ2V0TWV0aG9kKCJuZXdXU0RMUmVhZGVyIiwgbnVsbCk7Ci0JCU9iamVjdCBXU0RMUmVhZGVyT2JqZWN0ID0gbmV3V1NETFJlYWRlck1ldGhvZC5pbnZva2UoV1NETEZhY3RvcnlPYmplY3QsIG51bGwpOwotCQlDbGFzcyBXU0RMUmVhZGVyQ2xhc3MgPSBDbGFzc0xvYWRpbmdVdGlsCi0JCQkJLmxvYWRDbGFzc0Zyb21BbnRDbGFzc0xvYWRlcihXU0RMUmVhZGVyT2JqZWN0LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJTWV0aG9kIHJlYWRXU0RMTWV0aG9kID0gV1NETFJlYWRlckNsYXNzLmdldE1ldGhvZCgicmVhZFdTREwiLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9KTsKLQkJRGVmaW5pdGlvbkluc3RhbmNlID0gcmVhZFdTRExNZXRob2QuaW52b2tlKFdTRExSZWFkZXJPYmplY3QsIG5ldyBPYmplY3RbXXtmaWxlcGF0aH0pOwotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZXNwYWNlIG1hcCBmcm9tIGRlZmluaXRpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIE1hcCBnZXREZWZpbml0aW9uTmFtZXNwYWNlTWFwKCl7Ci0JCS8vcmV0dXJuIHdzZGxEZWZpbml0aW9uLmdldE5hbWVzcGFjZXMoKTsKLQkJTWFwIG1hcCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlNZXRob2QgZ2V0TmFtZXNwYWNlc01ldGhvZCA9IERlZmluaXRpb25DbGFzcy5nZXRNZXRob2QoImdldE5hbWVzcGFjZXMiLCBudWxsKTsKLQkJCW1hcCA9IChNYXApZ2V0TmFtZXNwYWNlc01ldGhvZC5pbnZva2UoRGVmaW5pdGlvbkluc3RhbmNlLCBudWxsKTsKLQkJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbWFwOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZGVmYXVsdCBwYWNrYWdlIGRlcml2ZWQgYnkgdGhlIHRhcmdldE5hbWVzcGFjZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgcGFja2FnZUZyb21UYXJnZXROYW1lc3BhY2UoKXsKLQkJLy9yZXR1cm4gIFVSTFByb2Nlc3Nvci5tYWtlUGFja2FnZU5hbWUod3NkbERlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotCQlTdHJpbmcgcmV0dXJuU3RyaW5nID0gbnVsbDsKLQkJdHJ5ewotCQkJTWV0aG9kIGdldFRhcmdldE5hbWVzcGFjZU1ldGhvZCA9IERlZmluaXRpb25DbGFzcy5nZXRNZXRob2QoImdldFRhcmdldE5hbWVzcGFjZSIsIG51bGwpOwotCQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gKFN0cmluZylnZXRUYXJnZXROYW1lc3BhY2VNZXRob2QuaW52b2tlKERlZmluaXRpb25JbnN0YW5jZSwgbnVsbCk7Ci0JCQlDbGFzcyBVUkxQcm9jZXNzb3JDbGFzcyA9IENsYXNzTG9hZGluZ1V0aWwKLQkJCQkJLmxvYWRDbGFzc0Zyb21BbnRDbGFzc0xvYWRlcigib3JnLmFwYWNoZS5heGlzMi51dGlsLlVSTFByb2Nlc3NvciIpOwotCQkJTWV0aG9kIG1ha2VQYWNrYWdlTmFtZU1ldGhvZCA9IFVSTFByb2Nlc3NvckNsYXNzCi0JCQkJCS5nZXRNZXRob2QoIm1ha2VQYWNrYWdlTmFtZSIsIG5ldyBDbGFzc1tde1N0cmluZy5jbGFzc30pOwotCQkJcmV0dXJuU3RyaW5nID0gKFN0cmluZyltYWtlUGFja2FnZU5hbWVNZXRob2QuaW52b2tlKG51bGwsIG5ldyBPYmplY3RbXXtwYWNrYWdlTmFtZX0pOwotCQl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQkJcmV0dXJuIHJldHVyblN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzZXJ2aWNlIG5hbWVzCi0JICogdGhlIG5hbWVzIGFyZSBRTmFtZXMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIExpc3QgZ2V0U2VydmljZUxpc3QoKXsKLQkJLy9TZXJ2aWNlIHNlcnZpY2UgPSBudWxsOwotCQkvL01hcCBzZXJ2aWNlTWFwID0gd3NkbERlZmluaXRpb24uZ2V0U2VydmljZXMoKTsKLQkJLy9zZXJ2aWNlID0gKFNlcnZpY2Upc2VydmljZUl0ZXJhdG9yLm5leHQoKTsKLQkJLy9yZXR1cm5MaXN0LmFkZChzZXJ2aWNlLmdldFFOYW1lKCkpOwotCQlMaXN0IHJldHVybkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRyeXsKLQkJCU9iamVjdCBzZXJ2aWNlSW5zdGFuY2U7Ci0JCQlNZXRob2QgZ2V0U2VydmljZXNNZXRob2QgPSBEZWZpbml0aW9uQ2xhc3MuZ2V0TWV0aG9kKCJnZXRTZXJ2aWNlcyIsIG51bGwpOwotCQkJTWFwIHNlcnZpY2VNYXAgPSAoTWFwKWdldFNlcnZpY2VzTWV0aG9kLmludm9rZShEZWZpbml0aW9uSW5zdGFuY2UsIG51bGwpOwotCi0JCQlpZihzZXJ2aWNlTWFwIT1udWxsICYmICFzZXJ2aWNlTWFwLmlzRW1wdHkoKSl7Ci0JCQkJSXRlcmF0b3Igc2VydmljZUl0ZXJhdG9yID0gc2VydmljZU1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlKHNlcnZpY2VJdGVyYXRvci5oYXNOZXh0KCkpewotCQkJCQlTZXJ2aWNlQ2xhc3MgPSBDbGFzc0xvYWRpbmdVdGlsCi0JCQkJCQkJLmxvYWRDbGFzc0Zyb21BbnRDbGFzc0xvYWRlcigiamF2YXgud3NkbC5TZXJ2aWNlIik7Ci0JCQkJCU1ldGhvZCBnZXRRTmFtZU1ldGhvZCA9IFNlcnZpY2VDbGFzcy5nZXRNZXRob2QoImdldFFOYW1lIiwgbnVsbCk7Ci0JCQkJCXNlcnZpY2VJbnN0YW5jZSA9IChPYmplY3Qpc2VydmljZUl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJcmV0dXJuTGlzdC5hZGQoZ2V0UU5hbWVNZXRob2QuaW52b2tlKHNlcnZpY2VJbnN0YW5jZSwgbnVsbCkpOyAgIAotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gcmV0dXJuTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBwb3J0cyBmb3IgYSBwYXJ0aWN1bGFyIHNlcnZpY2UKLQkgKiB0aGUgbmFtZXMgYXJlIFFOYW1lcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQb3J0TmFtZUxpc3QoT2JqZWN0IHNlcnZpY2VOYW1lKXsKLQkJLy9MaXN0IHJldHVybkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vU2VydmljZSBzZXJ2aWNlID0gd3NkbERlZmluaXRpb24uZ2V0U2VydmljZShzZXJ2aWNlTmFtZSk7Ci0JCS8vUG9ydCBwb3J0ID0gbnVsbDsgCi0JCS8vaWYoc2VydmljZSE9bnVsbCl7Ci0JCS8vCU1hcCBwb3J0TWFwID0gc2VydmljZS5nZXRQb3J0cygpOwotCQkvLwlpZiAocG9ydE1hcCE9bnVsbCAmJiAhcG9ydE1hcC5pc0VtcHR5KCkpewotCQkvLwkJSXRlcmF0b3IgcG9ydEl0ZXJhdG9yID0gcG9ydE1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkvLwkJd2hpbGUocG9ydEl0ZXJhdG9yLmhhc05leHQoKSl7Ci0JCS8vCQkJcG9ydCA9IChQb3J0KXBvcnRJdGVyYXRvci5uZXh0KCk7Ci0JCS8vCQkJcmV0dXJuTGlzdC5hZGQocG9ydC5nZXROYW1lKCkpOwotCQkvLwkJfQotCQkvLwl9Ci0JCS8vfQotCQkvL3JldHVybiByZXR1cm5MaXN0OwotCi0JCUxpc3QgcmV0dXJuTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdHJ5ewkKLQkJCU1ldGhvZCBnZXRTZXJ2aWNlTWV0aG9kID0gRGVmaW5pdGlvbkNsYXNzCi0JCQkJCQkuZ2V0TWV0aG9kKCJnZXRTZXJ2aWNlIiwgbmV3IENsYXNzW117c2VydmljZU5hbWUuZ2V0Q2xhc3MoKX0pOwotCQkJT2JqZWN0IHNlcnZpY2VJbnN0YW5jZSA9IGdldFNlcnZpY2VNZXRob2QKLQkJCQkJCS5pbnZva2UoRGVmaW5pdGlvbkluc3RhbmNlLCBuZXcgT2JqZWN0W117c2VydmljZU5hbWV9KTsKLQkJCU9iamVjdCBwb3J0SW5zdGFuY2UgPSBudWxsOwotCQkJaWYoc2VydmljZUluc3RhbmNlIT1udWxsKXsKLQkJCQlNZXRob2QgZ2V0UG9ydHNNZXRob2QgPSBTZXJ2aWNlQ2xhc3MuZ2V0TWV0aG9kKCJnZXRQb3J0cyIsIG51bGwpOwotCQkJCU1hcCBwb3J0TWFwID0gKE1hcClnZXRQb3J0c01ldGhvZC5pbnZva2Uoc2VydmljZUluc3RhbmNlLCBudWxsKTsKLQkJCQlpZiAocG9ydE1hcCE9bnVsbCAmJiAhcG9ydE1hcC5pc0VtcHR5KCkpewotCQkJCQlJdGVyYXRvciBwb3J0SXRlcmF0b3IgPSBwb3J0TWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQkJCXdoaWxlKHBvcnRJdGVyYXRvci5oYXNOZXh0KCkpewotCQkJCQkJcG9ydEluc3RhbmNlID0gKE9iamVjdClwb3J0SXRlcmF0b3IubmV4dCgpOwotCQkJCQkJQ2xhc3MgUG9ydENsYXNzID0gQ2xhc3NMb2FkaW5nVXRpbAotCQkJCQkJCQkubG9hZENsYXNzRnJvbUFudENsYXNzTG9hZGVyKCJqYXZheC53c2RsLlBvcnQiKTsKLQkJCQkJCU1ldGhvZCBnZXROYW1lTWV0aG9kID0gUG9ydENsYXNzLmdldE1ldGhvZCgiZ2V0TmFtZSIsIG51bGwpOwotCQkJCQkJcmV0dXJuTGlzdC5hZGQoZ2V0TmFtZU1ldGhvZC5pbnZva2UocG9ydEluc3RhbmNlLG51bGwpKTsgCi0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0KLQkJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gcmV0dXJuTGlzdDsKLQl9Ci0JCi0gICAgLyoqCi0gICAgICogcHVibGljIG1ldGhvZCB0byBnZXQgbG9hZGVkIHdzZGwgRGVmaW5pdGlvbiBJbnN0YW5jZQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFdzZGxEZWZpbml0aW9uSW5zdGFuY2UoKSB7Ci0gICAgICAgICAgICByZXR1cm4gRGVmaW5pdGlvbkluc3RhbmNlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBwdWJsaWMgbWV0aG9kIHRvIGdldCBsb2FkZWQgRGVmaW5pdGlvbiBDbGFzcwotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0V3NkbERlZmluaXRpb25DbGFzcygpIHsKLSAgICAgICAgICAgIHJldHVybiBEZWZpbml0aW9uQ2xhc3M7Ci0gICAgfQotCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jcmVhdGlvbi9jb3JlL2RhdGEvRGF0YU1vZGVsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY3JlYXRpb24vY29yZS9kYXRhL0RhdGFNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDAwZDYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jcmVhdGlvbi9jb3JlL2RhdGEvRGF0YU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBXU08yIEluYy4gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogV1NPMiBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDcwMTEwICAgMTY4NzYyIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgY29kZSB0byBpbnRyb2R1c2UgdGhlIEF4aXMyIAotICogCQkJCQkJCQkJCSAgcnVudGltZSB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjIKLSAqIDIwMDcwNTE4ICAgMTg3MzExIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEZpeGluZyB0ZXN0IHJlc291cmNlIGFkZGl0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUuZGF0YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLmRhdGEuTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBEYXRhTW9kZWwgZXh0ZW5kcyBNb2RlbHsKLQkKLQkvL0NsaWVudCBTaWRlCi0JcHJpdmF0ZSBTdHJpbmcgc2VydmljZUNsYXNzOwotCXByaXZhdGUgYm9vbGVhbiBnZW5lcmF0ZVNlcnZpY2VzWE1MOwotCXByaXZhdGUgYm9vbGVhbiBzZXJ2aWNlc1hNTDsKLQlwcml2YXRlIGJvb2xlYW4gZ2VuZXJhdGVBQVI7Ci0JcHJpdmF0ZSBTdHJpbmcgIHBhdGhUb1NlcnZpY2VzWE1MOwotCXByaXZhdGUgU3RyaW5nICBwYXRoVG9XZWJTZXJ2aWNlc1RlbXBEaXI7Ci0JCi0JLy9TZXJ2ZXIgU2lkZSAKLQlwcml2YXRlIGJvb2xlYW4gZ2VuZXJhdGVTZXJ2ZXJTaWRlSW50ZXJmYWNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBzZXJ2ZXJYTUxDaGVjazsKLQlwcml2YXRlIGJvb2xlYW4gZ2VuZXJhdGVBbGxDaGVjazsKLQlwcml2YXRlIFN0cmluZyBkYXRhYmluZGluZ1R5cGU7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYXNlVG9QYWNrYWdlTWFwcGluZzsKLQotCi0JcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZVNlcnZpY2VzWE1MKCl7Ci0JCXJldHVybiBnZW5lcmF0ZVNlcnZpY2VzWE1MOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEdlbmVyYXRlU2VydmljZXNYTUwoYm9vbGVhbiBnZW5lcmF0ZVNlcnZpY2VzWE1MKXsKLQkJdGhpcy5nZW5lcmF0ZVNlcnZpY2VzWE1MID0gZ2VuZXJhdGVTZXJ2aWNlc1hNTDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhdGhUb1NlcnZpY2VzWE1MKCl7Ci0JCXJldHVybiBwYXRoVG9TZXJ2aWNlc1hNTDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXRoVG9TZXJ2aWNlc1hNTChTdHJpbmcgcGF0aFRvU2VydmljZXNYTUwpewotCQl0aGlzLnBhdGhUb1NlcnZpY2VzWE1MID0gcGF0aFRvU2VydmljZXNYTUw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZUFBUigpIHsKLQkJcmV0dXJuIGdlbmVyYXRlQUFSOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEdlbmVyYXRlQUFSKGJvb2xlYW4gZ2VuZXJhdGVBQVIpIHsKLQkJdGhpcy5nZW5lcmF0ZUFBUiA9IGdlbmVyYXRlQUFSOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU2VydmljZXNYTUwoKSB7Ci0JCXJldHVybiBzZXJ2aWNlc1hNTDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlc1hNTChib29sZWFuIHNlcnZpY2VzWE1MKSB7Ci0JCXRoaXMuc2VydmljZXNYTUwgPSBzZXJ2aWNlc1hNTDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhdGhUb1dlYlNlcnZpY2VzVGVtcERpcigpIHsKLQkJcmV0dXJuIHBhdGhUb1dlYlNlcnZpY2VzVGVtcERpcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXRoVG9XZWJTZXJ2aWNlc1RlbXBEaXIoU3RyaW5nIHBhdGhUb1dlYlNlcnZpY2VzVGVtcERpcikgewotCQl0aGlzLnBhdGhUb1dlYlNlcnZpY2VzVGVtcERpciA9IHBhdGhUb1dlYlNlcnZpY2VzVGVtcERpcjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFdzZGxVUkkoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRXc2RsVVJJKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0V3NkbFVSSShTdHJpbmcgd3NkbFVSSSkgewotCQlzdXBlci5zZXRXc2RsVVJJKHdzZGxVUkkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YWJpbmRpbmdUeXBlKCkgewotCQlyZXR1cm4gZGF0YWJpbmRpbmdUeXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERhdGFiaW5kaW5nVHlwZShTdHJpbmcgZGF0YWJpbmRpbmdUeXBlKSB7Ci0JCXRoaXMuZGF0YWJpbmRpbmdUeXBlID0gZGF0YWJpbmRpbmdUeXBlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzR2VuZXJhdGVBbGxDaGVjaygpIHsKLQkJcmV0dXJuIGdlbmVyYXRlQWxsQ2hlY2s7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0R2VuZXJhdGVBbGxDaGVjayhib29sZWFuIGdlbmVyYXRlQWxsQ2hlY2spIHsKLQkJdGhpcy5nZW5lcmF0ZUFsbENoZWNrID0gZ2VuZXJhdGVBbGxDaGVjazsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlU2VydmVyU2lkZUludGVyZmFjZSgpIHsKLQkJcmV0dXJuIGdlbmVyYXRlU2VydmVyU2lkZUludGVyZmFjZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVNlcnZlclNpZGVJbnRlcmZhY2UoYm9vbGVhbiBnZW5lcmF0ZVNlcnZlclNpZGVJbnRlcmZhY2UpIHsKLQkJdGhpcy5nZW5lcmF0ZVNlcnZlclNpZGVJbnRlcmZhY2UgPSBnZW5lcmF0ZVNlcnZlclNpZGVJbnRlcmZhY2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQb3J0TmFtZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFBvcnROYW1lKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UG9ydE5hbWUoU3RyaW5nIHBvcnROYW1lKSB7Ci0JCXN1cGVyLnNldFBvcnROYW1lKHBvcnROYW1lKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NlcnZlclhNTENoZWNrKCkgewotCQlyZXR1cm4gc2VydmVyWE1MQ2hlY2s7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VydmVyWE1MQ2hlY2soYm9vbGVhbiBzZXJ2ZXJYTUxDaGVjaykgewotCQl0aGlzLnNlcnZlclhNTENoZWNrID0gc2VydmVyWE1MQ2hlY2s7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlTmFtZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFNlcnZpY2VOYW1lKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VydmljZU5hbWUoU3RyaW5nIHNlcnZpY2VOYW1lKSB7Ci0JCXN1cGVyLnNldFNlcnZpY2VOYW1lKHNlcnZpY2VOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VUZXh0KCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0UGFja2FnZVRleHQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYWNrYWdlVGV4dChTdHJpbmcgcGFja2FnZVRleHQpIHsKLQkJc3VwZXIuc2V0UGFja2FnZVRleHQocGFja2FnZVRleHQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZUNsYXNzKCkgewotCQlyZXR1cm4gc2VydmljZUNsYXNzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VDbGFzcyhTdHJpbmcgc2VydmljZUNsYXNzKSB7Ci0JCXRoaXMuc2VydmljZUNsYXNzID0gc2VydmljZUNsYXNzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYXNlVG9QYWNrYWdlTWFwcGluZygpIHsKLQkJcmV0dXJuIG5hbWVzcGFzZVRvUGFja2FnZU1hcHBpbmc7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZXNwYXNlVG9QYWNrYWdlTWFwcGluZyhTdHJpbmcgbmFtZXNwYXNlVG9QYWNrYWdlTWFwcGluZykgewotCQl0aGlzLm5hbWVzcGFzZVRvUGFja2FnZU1hcHBpbmcgPSBuYW1lc3Bhc2VUb1BhY2thZ2VNYXBwaW5nOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24udWkvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNGU4NjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24udWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi51aS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24udWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE2NDQ2Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1idWlsZC54bWwKLWphdmFDb21waWxlci4uLmFyZ3MKLUBkb3QKLW9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi51aV8xLjAuMTAxLjIwMDgwNDAyMDIwNC5qYXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLnVpLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24udWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2ZDY2MmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24udWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24udWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjVjM2Q0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLSNTdW4gTWF5IDA2IDE3OjMzOjIzIExLVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YjdjN2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI1dlZCBGZWIgMjEgMTA6NDg6MjcgTEtUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdAotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz5cbjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThmNGRhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVQTFVHSU5fTkFNRQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLnVpO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4xMDEucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpczIuY29uc3VtcHRpb24udWkucGx1Z2luLldlYlNlcnZpY2VBeGlzMkNvbnN1bXB0aW9uVUlQbHVnaW4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS51aS5pZGUsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmUsCi0gb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlciwKLSBvcmcuZWNsaXBzZS5qc3Qud3MsCi0gb3JnLmVjbGlwc2UuanN0LndzLnVpLAotIG9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWksCi0gb3JnLmVjbGlwc2Uud3N0LndzLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWksCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcywKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LAotIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLAotIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1WZW5kb3I6ICVQTFVHSU5fUFJPVklERVIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpczIuY29uc3VtcHRpb24udWkucGx1Z2luLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzMi5jb25zdW1wdGlvbi51aS53aWRnZXRzLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzMi5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzMi5jb25zdW1wdGlvbi51aS53c3J0Ci1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLnVpL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTczYmRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lIDA2LCAyMDA3PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGNjY2RlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBXU08yIEluYyBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIFdTTzIgSW5jIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0jIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIDIwMDcwMTMwICAgMTY4NzYyIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgY29kZSB0byBpbnRyb2R1c2UgdGhlIAotIwkJCQkJCQkJCQkJQXhpczIgcnVudGltZSB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjIKLSMgMjAwNzA1MDIgICAxODQzMDIgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgRml4IGNvcHlyaWdodCBmb3IgQXhpczIgcGx1Z2lucwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24udWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwM2NhNzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24udWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBXU08yIEluYy4gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBXU08yIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSMgLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgMjAwNzAxMTggICAxNjg3NjIgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgSW5pdGlhbCBjb2RlIHRvIGludHJvZHVzZSB0aGUgQXhpczIgcnVudGltZSB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjIKLSMgMjAwNzA1MDEgICAxODQ2MTcgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgUHJvdmlkZSBwbHVnaW4gZGV0YWlscwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotCi0jCi0jIE1lc3NhZ2VzIGluIHBsdWdpbi54bWwuCi0jCi1QTFVHSU5fTkFNRT1XZWJzZXJ2aWNlIEF4aXMyIENvbnN1bXB0aW9uIFVJIFBsdWctaW4KLVBMVUdJTl9QUk9WSURFUj1XU08yCi0KLVdFQlNFUlZJQ0VDTElFTlRUWVBFX05BTUVfSkFWQV9BWElTPUphdmEgcHJveHkKLUxBQkVMX1JVTlRJTUVfQVhJU18xMT1BcGFjaGUgQXhpczIKLURFU0NfUlVOVElNRV9BWElTXzExPUFwYWNoZSBBeGlzMgotIwotIwlXZWIgU2VydmljZXMgUHJlZmVyYW5jZSBQYWdlcwotIwotIyBDYXRlZ29yaWVzCi1QUkVGRVJFTkNFX0NBVEVHT1JZX0FYSVMyX0VNSVRURVI9QXhpczIgRW1pdHRlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24udWkvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMTRhZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24udWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci0KLTxwbHVnaW4+Ci0gICAKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0UmVnaXN0cnkiPgotICAgICAgIDx3aWRnZXRGYWN0b3J5ICAgCi0gICAgICAgICAgICAgaWQ9IkF4aXMyQ2xpZW50Q29uZmlnIgotICAgICAgICAgICAgIGluc2VydEJlZm9yZUNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZC5BeGlzMldlYnNlcnZpY2VzU2VydmVyQ29tbWFuZCIKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMyLmNvbnN1bXB0aW9uLnVpLndzcnQuQXhpczJDbGllbnRDb25maWdXaWRnZXRGYWN0b3J5Ii8+Ci0gICAgPC9leHRlbnNpb24+IAotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5hbnREYXRhTWFwcGluZyI+Ci0gICAgICAgIDxtYXAKLSAgICAgICAgICAgICAga2V5PSJDbGllbnRQcm9qZWN0TmFtZSIKLSAgICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS5jb21tYW5kLkF4aXMyQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQiCi0gICAgICAgICAgICAgIHByb3BlcnR5PSJDbGllbnRQcm9qZWN0IgotICAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyIi8+Ci0gICAgPC9leHRlbnNpb24+IAotCi08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMyL2NvbnN1bXB0aW9uL3VpL3BsdWdpbi9XZWJTZXJ2aWNlQXhpczJDb25zdW1wdGlvblVJUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMyL2NvbnN1bXB0aW9uL3VpL3BsdWdpbi9XZWJTZXJ2aWNlQXhpczJDb25zdW1wdGlvblVJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkYzkxMmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzMi9jb25zdW1wdGlvbi91aS9wbHVnaW4vV2ViU2VydmljZUF4aXMyQ29uc3VtcHRpb25VSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBXU08yIEluYyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBXU08yIEluYyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDEzMCAgIDE2ODc2MiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbml0aWFsIGNvZGUgdG8gaW50cm9kdXNlIHRoZSAKLSAqIAkJCQkJCQkJCQkJQXhpczIgcnVudGltZSB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjIKLSAqIDIwMDcwNTAyICAgMTg0MzAyIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEZpeCBjb3B5cmlnaHQgZm9yIEF4aXMyIHBsdWdpbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpczIuY29uc3VtcHRpb24udWkucGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VBeGlzMkNvbnN1bXB0aW9uVUlQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCi0JLy8gVGhlIHBsdWctaW4gSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLnVpIjsKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBXZWJTZXJ2aWNlQXhpczJDb25zdW1wdGlvblVJUGx1Z2luIHBsdWdpbjsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgV2ViU2VydmljZUF4aXMyQ29uc3VtcHRpb25VSVBsdWdpbigpIHsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdlYlNlcnZpY2VBeGlzMkNvbnN1bXB0aW9uVUlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpczIvY29uc3VtcHRpb24vdWkvdGFzay9EZWZhdWx0c0ZvckhUVFBCYXNpY0F1dGhDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMyL2NvbnN1bXB0aW9uL3VpL3Rhc2svRGVmYXVsdHNGb3JIVFRQQmFzaWNBdXRoQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTQ0YmMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpczIvY29uc3VtcHRpb24vdWkvdGFzay9EZWZhdWx0c0ZvckhUVFBCYXNpY0F1dGhDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IFdTTzIgSW5jIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDcwMTMwICAgMTY4NzYyIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgY29kZSB0byBpbnRyb2R1c2UgdGhlIAotICogCQkJCQkJCQkJCQlBeGlzMiBydW50aW1lIHRvIHRoZSBmcmFtZXdvcmsgZm9yIDE2ODc2MgotICogMjAwNzA1MDIgICAxODQzMDIgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgRml4IGNvcHlyaWdodCBmb3IgQXhpczIgcGx1Z2lucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzMi5jb25zdW1wdGlvbi51aS50YXNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgRGVmYXVsdHNGb3JIVFRQQmFzaWNBdXRoQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKLQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pCi0JCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzMi9jb25zdW1wdGlvbi91aS93aWRnZXRzL0F4aXMyUHJveHlXaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpczIvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9BeGlzMlByb3h5V2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkZjNmN2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzMi9jb25zdW1wdGlvbi91aS93aWRnZXRzL0F4aXMyUHJveHlXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IFdTTzIgSW5jLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBXU08yIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzAxMzAgICAxNjg3NjIgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgSW5pdGlhbCBjb2RlIHRvIGludHJvZHVzZSB0aGUgQXhpczIgCi0gKiAJCQkJCQkJCQkJICBydW50aW1lIHRvIHRoZSBmcmFtZXdvcmsgZm9yIDE2ODc2MgotICogMjAwNzA0MjYgICAxODMwNDYgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aAotICogMjAwNzA1MTMgICAxODY0MzAgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgZml4IGZvciAxODY0MzAKLSAqCQkJCQkJCQkJCSAgVGV4dCBub3QgYWNjZXNzaWJsZSBvbiBBWElTMiB3aXphcmQgcGFnZXMuCi0gKiAyMDA3MDUyMyAgIDE3NDg3NiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBQZXJzaXN0IFByZWZlcmVuY2VzIGluc2lkZSBGcmFtZXdvcmsKLSAqIDIwMDcwODIzICAgMjAwNDEzIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIE5hbWVzcGFjZSB0byBQYWNrYWdlIHRhYmxlIGZpeAotICogMjAwNzA4MjQgICAyMDA1MTUgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgTk9OLU5MUyBtb3ZlIHRvIHNlcGVyYXRlIGZpbGUKLSAqIDIwMDcxMDMwCSAgMjA3NjE4IHppbmFAY2EuaWJtLmNvbSAtIFppbmEgTW9zdGFmaWEsIFBhZ2UgR1VJIHNlcXVlbmNlIHVzaW5nIHRhYiBpcyBub3QgY29ycmVjdCAoIHZpb2xhdGVzIEFjY2Vzc2liaWxpdHkpCi0gKiAyMDA4MDMxOSAgIDIwNzYxNiBtYWthbmRyZUBjYS5pYm0uY29tIC0gQW5kcmV3IE1haywgVGFibGUgaW4gQXhpczIgV2ViIFNlcnZpY2UgU2tlbGV0b24gSmF2YSBCZWFuIENvbmZpZ3VyYXRpb24gUGFnZSBub3QgQWNjZXNzaWJsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzMi5jb25zdW1wdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLmRhdGEuRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLm1lc3NhZ2VzLkF4aXMyQ29uc3VtcHRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLnV0aWxzLldTRExQcm9wZXJ0eVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5jb25zdGFudC5BeGlzMkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5jb250ZXh0LkF4aXMyRW1pdHRlckNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUucGx1Z2luLldlYlNlcnZpY2VBeGlzMkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUudXRpbHMuQ2xhc3NMb2FkaW5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkucGx1Z2luLldlYlNlcnZpY2VBeGlzMlVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5jb21tb24uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UYWJsZUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1c1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotCi1wdWJsaWMgY2xhc3MgQXhpczJQcm94eVdpZGdldCBleHRlbmRzIFNpbXBsZVdpZGdldERhdGFDb250cmlidXRvciB7Ci0JCi0JRGF0YU1vZGVsIG1vZGVsOwotCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQotCi0JcHVibGljIEF4aXMyUHJveHlXaWRnZXQoRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXRoaXMubW9kZWw9bW9kZWw7Ci0JfQotCi0JLy9wcml2YXRlIFN0cmluZyBwbHVnaW5JZF8gPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLnVpIjsKLQkKLQlwcml2YXRlIEJ1dHRvbiBnZW5Qcm94eUNoZWNrYm94XzsKLQlwcml2YXRlIEJ1dHRvbiBzeW5jQW5kQXN5bmNSYWRpb0J1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBzeW5jT25seVJhZGlvQnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIGFzeW5jT25seVJhZGlvQnV0dG9uOwotCS8vcHJpdmF0ZSBCdXR0b24gdGVzdENhc2VDaGVja0JveEJ1dHRvbjsKLQkvL3ByaXZhdGUgQnV0dG9uIGdlbmVyYXRlQWxsQ2hlY2tCb3hCdXR0b247Ci0JcHJpdmF0ZSBDb21ibyBkYXRhYmluZGluZ1R5cGVDb21ibzsKLQlwcml2YXRlIENvbWJvIHBvcnROYW1lQ29tYm87Ci0JcHJpdmF0ZSBDb21ibyBzZXJ2aWNlTmFtZUNvbWJvOwotCXByaXZhdGUgVGV4dCBwYWNrYWdlVGV4dDsKLQkKLQkvL3ByaXZhdGUgamF2YS51dGlsLkxpc3Qgc2VydmljZVFOYW1lTGlzdDIgPSBudWxsOwotCXByaXZhdGUgVGFibGUgbmFtZXNwYWNlMnBhY2thZ2VUYWJsZSA9IG51bGw7Ci0JcHJpdmF0ZSBCdXR0b24gZ2VuZXJhdGVBbGxDaGVja0JveEJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiB0ZXN0Q2FzZUNoZWNrQm94QnV0dG9uOwotCQotCXByaXZhdGUgV1NETFByb3BlcnR5UmVhZGVyIHJlYWRlcjsKLQlwcml2YXRlIExpc3Qgc2VydmljZVFOYW1lTGlzdCA9IG51bGw7Ci0JQXhpczJFbWl0dGVyQ29udGV4dCBjb250ZXh0OwotCi0KLQlwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyggQ29tcG9zaXRlIHBhcmVudCwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIgKQotCXsKLQkJY29udGV4dCA9IFdlYlNlcnZpY2VBeGlzMkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEF4aXNFbWl0dGVyQ29udGV4dCgpOwotCQlVSVV0aWxzIHVpVXRpbHMgPSBuZXcgVUlVdGlscyhXZWJTZXJ2aWNlQXhpczJVSVBsdWdpbi5QTFVHSU5fSUQpOwotCQkKLQkJQ29tcG9zaXRlICB0b3BDb21wID0gdWlVdGlscy5jcmVhdGVDb21wb3NpdGUocGFyZW50LCAyICk7Ci0JCi0JCS8vIHNlcnZpY2UgbmFtZQotCQlzZXJ2aWNlTmFtZUNvbWJvID0gdWlVdGlscy5jcmVhdGVDb21ibyh0b3BDb21wLCBBeGlzMkNvbnN1bXB0aW9uVUlNZXNzYWdlcy5MQUJFTF9TRVJWSUNFX05BTUVfQ0FQVElPTiwgbnVsbCwgbnVsbCwgU1dULlJFQURfT05MWSk7Ci0JCXNlcnZpY2VOYW1lQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCS8vbG9hZFBvcnROYW1lcygpOwotCQkJCW1vZGVsLnNldFNlcnZpY2VOYW1lKHNlcnZpY2VOYW1lQ29tYm8uZ2V0VGV4dCgpKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIHBvcnQgbmFtZQotCQlwb3J0TmFtZUNvbWJvID0gdWlVdGlscy5jcmVhdGVDb21ibyh0b3BDb21wLCBBeGlzMkNvbnN1bXB0aW9uVUlNZXNzYWdlcy5MQUJFTF9QT1JUTkFNRSwgbnVsbCwgbnVsbCwgU1dULlJFQURfT05MWSk7Ci0JCXBvcnROYW1lQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCW1vZGVsLnNldFBvcnROYW1lKHBvcnROYW1lQ29tYm8uZ2V0VGV4dCgpKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIERhdGFiaW5kaW5nCi0JCWRhdGFiaW5kaW5nVHlwZUNvbWJvID0gdWlVdGlscy5jcmVhdGVDb21ibyh0b3BDb21wLCBBeGlzMkNvbnN1bXB0aW9uVUlNZXNzYWdlcy5MQUJFTF9EQVRBQklORElOR19DQVBUSU9OLCBudWxsLCBudWxsLCBTV1QuUkVBRF9PTkxZKTsKLQkJZmlsbERhdGFiaW5kZXJDb21ibygpOwotCQlkYXRhYmluZGluZ1R5cGVDb21iby5zZWxlY3QoMCk7Ci0JCWRhdGFiaW5kaW5nVHlwZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQltb2RlbC5zZXREYXRhYmluZGluZ1R5cGUoZGF0YWJpbmRpbmdUeXBlQ29tYm8uZ2V0VGV4dCgpKTsKLQkJCX07Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfTsKLQkJfSk7Ci0JCQotCQkvLyBwYWNrYWdlIG5hbWUKLQkJcGFja2FnZVRleHQgPSB1aVV0aWxzLmNyZWF0ZVRleHQodG9wQ29tcCwgQXhpczJDb25zdW1wdGlvblVJTWVzc2FnZXMuTEFCRUxfUEFDS0VHRV9OQU1FLCBudWxsLCBudWxsLFNXVC5CT1JERVIpOwotCQlwYWNrYWdlVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQltb2RlbC5zZXRQYWNrYWdlVGV4dChwYWNrYWdlVGV4dC5nZXRUZXh0KCkpOwotCQkJfQotCQl9KTsKLQkJCi0JICAJLy9DbGllbnQgdHlwZSBsYWJlbCAKLQkJR3JvdXAgY2xpZW50VHlwZUdyb3VwID0gdWlVdGlscy5jcmVhdGVHcm91cChwYXJlbnQsIEF4aXMyQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkxBQkVMX0NMSUVOVF9TSURFLCBudWxsLCBudWxsKTsKLQkJCQkKLQkJc3luY0FuZEFzeW5jUmFkaW9CdXR0b24gPSB1aVV0aWxzLmNyZWF0ZVJhZGlvQnV0dG9uKGNsaWVudFR5cGVHcm91cCwgQXhpczJDb25zdW1wdGlvblVJTWVzc2FnZXMuTEFCRUxfU1lOQ19BTkRfQVNZTkMsIG51bGwsIG51bGwpOwotCQlzeW5jQW5kQXN5bmNSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24oCi0JCQkJKChjb250ZXh0LmlzQXN5bmMoKSB8fCBjb250ZXh0LmlzU3luYygpKT09ZmFsc2UpCi0JCQkJP3RydWUKLQkJCQk6KGNvbnRleHQuaXNBc3luYygpICYmIGNvbnRleHQuaXNTeW5jKCkpKTsKLQkJc3luY0FuZEFzeW5jUmFkaW9CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCS8vQmVjYXVzZSBkZWZhdWx0IHNldHRpbmcgaW4gYXhpczIgdG8gYmUgYm90aCBmYWxzZSBpbiB0aGllIGNhc2UKLQkJCQkvL0ZpbGUgYSBKSVJBIHRvIGZpeCB0aGlzLgotCQkJCW1vZGVsLnNldFN5bmMoIXN5bmNBbmRBc3luY1JhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJCQltb2RlbC5zZXRBU3luYyghc3luY0FuZEFzeW5jUmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJc3luY09ubHlSYWRpb0J1dHRvbiA9IHVpVXRpbHMuY3JlYXRlUmFkaW9CdXR0b24oY2xpZW50VHlwZUdyb3VwLCBBeGlzMkNvbnN1bXB0aW9uVUlNZXNzYWdlcy5MQUJFTF9TWU5DLCBudWxsLCBudWxsKTsKLQkJc3luY09ubHlSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc1N5bmMoKSAmJiAhY29udGV4dC5pc0FzeW5jKCkpOwotCQlzeW5jT25seVJhZGlvQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQltb2RlbC5zZXRTeW5jKHN5bmNPbmx5UmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQkJCW1vZGVsLnNldEFTeW5jKCFzeW5jT25seVJhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCi0JCWFzeW5jT25seVJhZGlvQnV0dG9uID0gdWlVdGlscy5jcmVhdGVSYWRpb0J1dHRvbihjbGllbnRUeXBlR3JvdXAsIEF4aXMyQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkxBQkVMX0FTWU5DLCBudWxsLCBudWxsKTsKLQkJYXN5bmNPbmx5UmFkaW9CdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNBc3luYygpICYmICFjb250ZXh0LmlzU3luYygpKTsKLQkJYXN5bmNPbmx5UmFkaW9CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCW1vZGVsLnNldEFTeW5jKGFzeW5jT25seVJhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJCQltb2RlbC5zZXRTeW5jKCFhc3luY09ubHlSYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQkJCi0JCS8vU2V0IHRoZSBzeW5jIGFzeW5jIHRvIGRlZmF1bHQgCi0JCW1vZGVsLnNldFN5bmMoY29udGV4dC5pc1N5bmMoKSk7Ci0JCW1vZGVsLnNldEFTeW5jKGNvbnRleHQuaXNBc3luYygpKTsKLQkJCi0JICAgCS8vIGdlbmVyYXRlIHRlc3QgY2FzZSBvcHRpb24KLQkJCi0JCUNvbXBvc2l0ZSBjaGVja0JveGVzID0gdWlVdGlscy5jcmVhdGVDb21wb3NpdGUocGFyZW50LCAxKTsKLQkJdGVzdENhc2VDaGVja0JveEJ1dHRvbiA9IHVpVXRpbHMuY3JlYXRlQ2hlY2tib3goY2hlY2tCb3hlcywgQXhpczJDb25zdW1wdGlvblVJTWVzc2FnZXMuTEFCRUxfR0VORVJBVEVfVEVTVENBU0VfQ0FQVElPTiwgbnVsbCwgbnVsbCk7Ci0JCXRlc3RDYXNlQ2hlY2tCb3hCdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNDbGllbnRUZXN0Q2FzZSgpKTsKLQkJbW9kZWwuc2V0VGVzdENhc2VDaGVjayhjb250ZXh0LmlzQ2xpZW50VGVzdENhc2UoKSk7Ci0JCXRlc3RDYXNlQ2hlY2tCb3hCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCW1vZGVsLnNldFRlc3RDYXNlQ2hlY2sodGVzdENhc2VDaGVja0JveEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCi0JCS8vIGdlbmVyYXRlIGFsbAotCQlnZW5lcmF0ZUFsbENoZWNrQm94QnV0dG9uID0gdWlVdGlscy5jcmVhdGVDaGVja2JveChjaGVja0JveGVzLCBBeGlzMkNvbnN1bXB0aW9uVUlNZXNzYWdlcy5MQUJFTF9HRU5FUkFURV9BTEwsIG51bGwsIG51bGwpOwotCQlnZW5lcmF0ZUFsbENoZWNrQm94QnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzQ2xpZW50R2VuZXJhdGVBbGwoKSk7Ci0JCWdlbmVyYXRlQWxsQ2hlY2tCb3hCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCW1vZGVsLnNldEdlbmVyYXRlQWxsQ2hlY2soZ2VuZXJhdGVBbGxDaGVja0JveEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCSAgIAotCSAgICBuZXcgTGFiZWwocGFyZW50LFNXVC5IT1JJWk9OVEFMKTsKLSAgICAgICAgbmFtZXNwYWNlMnBhY2thZ2VUYWJsZSA9IG5ldyBUYWJsZShwYXJlbnQsU1dULkJPUkRFUnxTV1QuRlVMTF9TRUxFQ1RJT04pOwotICAgICAgICBuYW1lc3BhY2UycGFja2FnZVRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLSAgICAgICAgbmFtZXNwYWNlMnBhY2thZ2VUYWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOyAKLSAgICAgICAgbmFtZXNwYWNlMnBhY2thZ2VUYWJsZS5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAKLSAgICAgICAgZGVjbGFyZUNvbHVtbihuYW1lc3BhY2UycGFja2FnZVRhYmxlLAotICAgICAgICAJCTM1MCwgLy9hIGRlZmF1bHQgd2lkdGggdW50aWwgd2UgYWRqdXN0Ci0gICAgICAgIAkJQXhpczJDb25zdW1wdGlvblVJTWVzc2FnZXMuTEFCRUxfTkFNRVNQQUNFKTsKLSAgICAgICAgZGVjbGFyZUNvbHVtbihuYW1lc3BhY2UycGFja2FnZVRhYmxlLAotICAgICAgICAJCTIwMCwvL2EgZGVmYXVsdCB3aWR0aCB1bnRpbCB3ZSBhZGp1c3QKLSAgICAgICAgCQlBeGlzMkNvbnN1bXB0aW9uVUlNZXNzYWdlcy5MQUJFTF9QQUNLQUdFKTsKLSAgICAgICAgCi0gICAgICAgIG5hbWVzcGFjZTJwYWNrYWdlVGFibGUuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGFkZCB0aGUgdGFibGUgZWRpdG9yCi0gICAgICAgIGZpbmFsIFRhYmxlRWRpdG9yIGVkaXRvciA9IG5ldyBUYWJsZUVkaXRvcihuYW1lc3BhY2UycGFja2FnZVRhYmxlKTsKLSAgICAgICAgZWRpdG9yLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuTEVGVDsKLSAgICAgICAgZWRpdG9yLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLQotICAgICAgICBuYW1lc3BhY2UycGFja2FnZVRhYmxlLmFkZExpc3RlbmVyKFNXVC5Nb3VzZURvd24sIG5ldyBMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgIFJlY3RhbmdsZSBjbGllbnRBcmVhID0gbmFtZXNwYWNlMnBhY2thZ2VUYWJsZS5nZXRDbGllbnRBcmVhKCk7Ci0gICAgICAgICAgICAgIFBvaW50IHB0ID0gbmV3IFBvaW50KGV2ZW50LngsIGV2ZW50LnkpOwotICAgICAgICAgICAgICBpbnQgaW5kZXggPSBuYW1lc3BhY2UycGFja2FnZVRhYmxlLmdldFRvcEluZGV4KCk7Ci0gICAgICAgICAgICAgIHdoaWxlIChpbmRleCA8IG5hbWVzcGFjZTJwYWNrYWdlVGFibGUuZ2V0SXRlbUNvdW50KCkpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIHZpc2libGUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBUYWJsZUl0ZW0gaXRlbSA9IG5hbWVzcGFjZTJwYWNrYWdlVGFibGUuZ2V0SXRlbShpbmRleCk7ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFJlY3RhbmdsZSByZWN0ID0gaXRlbS5nZXRCb3VuZHMoMSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlY3QuY29udGFpbnMocHQpKSB7Ci0gICAgICAgICAgICAgICAgCWVkaXRDZWxsKGl0ZW0sIGVkaXRvcik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCF2aXNpYmxlICYmIHJlY3QuaW50ZXJzZWN0cyhjbGllbnRBcmVhKSkgewotICAgICAgICAgICAgICAgICAgICB2aXNpYmxlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCF2aXNpYmxlKQotICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9KTsKLSAgICAgICAgCi0gICAgICAgIG5hbWVzcGFjZTJwYWNrYWdlVGFibGUuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJaWYgKG5hbWVzcGFjZTJwYWNrYWdlVGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKSA9PSAtMSkKLQkJCQkJbmFtZXNwYWNlMnBhY2thZ2VUYWJsZS5zZXRTZWxlY3Rpb24oMCk7Ci0JCQl9Ci0gICAgICAgIH0pOwotICAgICAgICAKLSAgICAgICAgbmFtZXNwYWNlMnBhY2thZ2VUYWJsZS5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpIHsKLSAgICAgICAgCXB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgewkJCQotICAgICAgICAJCWlmIChlLmtleUNvZGUgIT0gMzIpCi0gICAgICAgIAkJCXJldHVybjsKLQkJCQkJCQkJCi0gICAgICAgIAkJVGFibGVJdGVtW10gaXRlbSA9IG5hbWVzcGFjZTJwYWNrYWdlVGFibGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKGl0ZW0ubGVuZ3RoICE9IDEpCi0JCQkJCXJldHVybjsKLQkJCQkJCi0JCQkJZWRpdENlbGwoaXRlbVswXSwgZWRpdG9yKTsJCQkJCQkJCQkJCQkJCQkKLQkJCX0KLSAgICAgICAgfSk7ICAgICAgICAKLQotLy8JCVVJVXRpbHMgICAgICB1aVV0aWxzICA9IG5ldyBVSVV0aWxzKCBwbHVnaW5JZF8gKTsKLS8vCQlwYXJlbnQuc2V0VG9vbFRpcFRleHQoIEF4aXMyQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlRPT0xUSVBfUFBBRV9QQUdFICk7Ci0vLwkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCggcGFyZW50LCBwbHVnaW5JZF8gKyAiLiIgKyAgdGhpcy5wbHVnaW5JZF8pOwotCQkKLQkJcG9wdWxhdGVQYXJhbXNGcm9tV1NETCgpOwotCQlwb3B1bGF0ZU1vZGVsKCk7Ci0KLQkJcmV0dXJuIHRoaXM7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBlZGl0Q2VsbChmaW5hbCBUYWJsZUl0ZW0gaXRlbSwgVGFibGVFZGl0b3IgZWRpdG9yKSB7Ci0JCQotCQlmaW5hbCBUZXh0IHRleHRFZGl0ID0gbmV3IFRleHQobmFtZXNwYWNlMnBhY2thZ2VUYWJsZSwgU1dULk5PTkUpOwkJCi0JCXRleHRFZGl0LnNldFRleHQoaXRlbS5nZXRUZXh0KDEpKTsJCQkJCQkKLQkJdGV4dEVkaXQuc2VsZWN0QWxsKCk7Ci0JCXRleHRFZGl0LnNldEZvY3VzKCk7Ci0JCQotCQl0ZXh0RWRpdC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJaXRlbS5zZXRUZXh0KDEsIHRleHRFZGl0LmdldFRleHQoKSk7Ci0JCQkJdGV4dEVkaXQuZGlzcG9zZSgpOwotCQkJfQkJCQotCQl9KTsKLQkJCi0JCXRleHRFZGl0LmFkZFRyYXZlcnNlTGlzdGVuZXIobmV3IFRyYXZlcnNlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBlKSB7Ci0JCQkJc3dpdGNoIChlLmRldGFpbCkgewotCQkJCQljYXNlIFNXVC5UUkFWRVJTRV9SRVRVUk46Ci0JCQkJCQlpdGVtLnNldFRleHQoMSwgdGV4dEVkaXQuZ2V0VGV4dCgpKTsKLQkJCQkJY2FzZSBTV1QuVFJBVkVSU0VfRVNDQVBFOgotCQkJCQkJdGV4dEVkaXQuZGlzcG9zZSgpOwotCQkJCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQkJfQotCQkJfQkJCQotCQl9KTsKLQkJCi0JCXRleHRFZGl0LmFkZEtleUxpc3RlbmVyKG5ldyBLZXlBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0JCQkJaWYgKGUua2V5Q29kZSA9PSAzMikgewotCQkJCQlpdGVtLnNldFRleHQoMSwgdGV4dEVkaXQuZ2V0VGV4dCgpKTsKLQkJCQkJdGV4dEVkaXQuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0JCQkKLQkJfSk7Ci0JCQotCQl0ZXh0RWRpdC5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7Ci0JCQkJbW9kZWwuc2V0TmFtZXNwYXNlVG9QYWNrYWdlTWFwcGluZyhnZXROczJQa2dNYXBwaW5nKCkpOwkJCQkKLQkJCX0JCQkKLQkJfSk7Ci0JCQotCQllZGl0b3Iuc2V0RWRpdG9yKHRleHRFZGl0LCBpdGVtLCAxKTsKLQl9Ci0JCi0JLyoqCi0JICogQSB1dGlsIG1ldGhvZCB0byBjcmVhdGUgYSBuZXcgY29sdW1uCi0JICogQHBhcmFtIHRhYmxlCi0JICogQHBhcmFtIHdpZHRoCi0JICogQHBhcmFtIGNvbE5hbWUKLQkgKi8KLQlwcml2YXRlIHZvaWQgZGVjbGFyZUNvbHVtbihUYWJsZSB0YWJsZSwgaW50IHdpZHRoLFN0cmluZyBjb2xOYW1lKXsKLSAgICAgICAgVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLFNXVC5OT05FKTsKLSAgICAgICAgY29sdW1uLnNldFdpZHRoKHdpZHRoKTsKLSAgICAgICAgY29sdW1uLnNldFRleHQoY29sTmFtZSk7Ci0gICAgfQotCQotCS8qKgotCSAqIGdldCB0aGUgcGFja2FnZSB0byBuYW1lc3BhY2UgbWFwcGluZ3MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROczJQa2dNYXBwaW5nKCl7Ci0JCVN0cmluZyByZXR1cm5MaXN0PSIiOwotCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5hbWVzcGFjZTJwYWNrYWdlVGFibGUuZ2V0SXRlbXMoKTsKLQkJU3RyaW5nIHBhY2thZ2VWYWx1ZTsgCi0JCWZvciAoaW50IGk9MDtpPGl0ZW1zLmxlbmd0aDtpKyspewotCQkJcGFja2FnZVZhbHVlID0gaXRlbXNbaV0uZ2V0VGV4dCgxKTsKLQkJCWlmIChwYWNrYWdlVmFsdWUhPW51bGwgJiYgISIiLmVxdWFscyhwYWNrYWdlVmFsdWUpKXsKLQkJCQlyZXR1cm5MaXN0ID0gcmV0dXJuTGlzdCArCi0JCQkJICAgICAgICAgICAgICgiIi5lcXVhbHMocmV0dXJuTGlzdCk/IiI6IiwiKSArCi0JCQkJICAgICAgICAgICAgIGl0ZW1zW2ldLmdldFRleHQoMCkrICI9IiArIHBhY2thZ2VWYWx1ZTsKLQkJCX0KLQkJCQotCQl9Ci0JCXJldHVybiAiIi5lcXVhbHMocmV0dXJuTGlzdCk/bnVsbDpyZXR1cm5MaXN0OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzR2VuUHJveHkoKQl7Ci0JCS8vYm9vbGVhbiBlbmFibGVkID0gZ2VuUHJveHlDaGVja2JveF8uZ2V0U2VsZWN0aW9uKCk7Ci0JCXJldHVybiB0cnVlOyAvL2Fsd2F5cwotCi0JfQotCi0JcHVibGljIHZvaWQgc2V0R2VuZXJhdGVQcm94eSggQm9vbGVhbiBnZW5Qcm94eSApewotCQlnZW5Qcm94eUNoZWNrYm94Xy5zZXRTZWxlY3Rpb24oIGdlblByb3h5LmJvb2xlYW5WYWx1ZSgpICk7Ci0JfSAgIAotCQotCS8qKgotCSAqIEZpbGwgdGhlIGNvbWJvIHdpdGggcHJvcGVyIGRhdGFiaW5kaW5nIG5hbWVzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZpbGxEYXRhYmluZGVyQ29tYm8oKSB7Ci0JCWRhdGFiaW5kaW5nVHlwZUNvbWJvLmFkZChBeGlzMkNvbnN0YW50cy5EQVRBX0JJTkRJTkdfQURCKTsKLQkJZGF0YWJpbmRpbmdUeXBlQ29tYm8uYWRkKEF4aXMyQ29uc3RhbnRzLkRBVEFfQklORElOR19OT05FKTsKLQkJZGF0YWJpbmRpbmdUeXBlQ29tYm8uc2VsZWN0KDApOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVNb2RlbCgpIHsKLQkJbW9kZWwuc2V0U2VydmljZU5hbWUoc2VydmljZU5hbWVDb21iby5nZXRUZXh0KCkpOwotCQltb2RlbC5zZXRQb3J0TmFtZShwb3J0TmFtZUNvbWJvLmdldFRleHQoKSk7Ci0JCW1vZGVsLnNldFBhY2thZ2VUZXh0KHBhY2thZ2VUZXh0LmdldFRleHQoKSk7Ci0JCW1vZGVsLnNldERhdGFiaW5kaW5nVHlwZShkYXRhYmluZGluZ1R5cGVDb21iby5nZXRUZXh0KCkpOwotCQkvL21vZGVsLnNldEFTeW5jKGFzeW5jT25seVJhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJLy9tb2RlbC5zZXRTeW5jKHN5bmNPbmx5UmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQlpZiAoc3luY0FuZEFzeW5jUmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCkpewotCQkJbW9kZWwuc2V0QVN5bmMoIXN5bmNBbmRBc3luY1JhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJCW1vZGVsLnNldFN5bmMoIXN5bmNBbmRBc3luY1JhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJfQotCQltb2RlbC5zZXRHZW5lcmF0ZUFsbENoZWNrKGdlbmVyYXRlQWxsQ2hlY2tCb3hCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQltb2RlbC5zZXRUZXN0Q2FzZUNoZWNrKHRlc3RDYXNlQ2hlY2tCb3hCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQltb2RlbC5zZXROYW1lc3Bhc2VUb1BhY2thZ2VNYXBwaW5nKGdldE5zMlBrZ01hcHBpbmcoKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3IjZ2V0U3RhdHVzKCkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBnZXRTdGF0dXMoKSAKLQl7Ci0JCUlTdGF0dXMgcmVzdWx0ID0gbnVsbDsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVQYWNrYWdlTmFtZSgpIHsKLQkJdGhpcy5wYWNrYWdlVGV4dC5zZXRUZXh0KHJlYWRlci5wYWNrYWdlRnJvbVRhcmdldE5hbWVzcGFjZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBwb3B1bGF0ZSB0aGUgc2VydmljZSBhbmQgdGhlIHBvcnQgZnJvbSB0aGUgV1NETCB0aGlzIG5lZWRzIHRvIGJlIHB1YmxpYwotCSAqIHNpbmNlIHRoZSBXU0RMc2VsZWN0aW9uIHBhZ2UgbWF5IGNhbGwgdGhpcwotCSAqLwotCXB1YmxpYyB2b2lkIHBvcHVsYXRlUGFyYW1zRnJvbVdTREwoKSB7Ci0JCWlmIChyZWFkZXIgPT0gbnVsbCkKLQkJCXJlYWRlciA9IG5ldyBXU0RMUHJvcGVydHlSZWFkZXIoKTsKLQkJdHJ5IHsKLQkJCVN0cmluZyBsbmFtZSA9IG1vZGVsLmdldFdzZGxVUkkoKTsKLQkJCWlmICghIiIuZXF1YWxzKGxuYW1lLnRyaW0oKSkpIHsKLQotCQkJCXJlYWRlci5yZWFkV1NETChtb2RlbC5nZXRXZWJQcm9qZWN0TmFtZSgpLCBsbmFtZSk7Ci0KLQkJCQl0aGlzLnNlcnZpY2VRTmFtZUxpc3QgPSByZWFkZXIuZ2V0U2VydmljZUxpc3QoKTsKLQkJCQlpZiAoIXNlcnZpY2VRTmFtZUxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCXNlcnZpY2VOYW1lQ29tYm8ucmVtb3ZlQWxsKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VydmljZVFOYW1lTGlzdC5zaXplKCk7IGkrKykgewotCQkJCQkJLy8gYWRkIHRoZSBsb2NhbCBwYXJ0IG9mIHRoZQotCQkJCQkJT2JqZWN0IHNlcnZpY2VRbmFtZUluc3RhbmNlID0gc2VydmljZVFOYW1lTGlzdC5nZXQoMCk7Ci0JCQkJCQlDbGFzcyBRTmFtZUNsYXNzID0gQ2xhc3NMb2FkaW5nVXRpbAotCQkJCQkJCQkubG9hZENsYXNzRnJvbUFudENsYXNzTG9hZGVyKCJqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIik7Ci0JCQkJCQlNZXRob2QgR2V0TG9jYWxQYXJ0TWV0aG9kICA9IFFOYW1lQ2xhc3MuZ2V0TWV0aG9kKCJnZXRMb2NhbFBhcnQiLCBudWxsKTsKLQkJCQkJCU9iamVjdCByZXN1bHRMb2NhbFBhcnQgPSBHZXRMb2NhbFBhcnRNZXRob2QKLQkJCQkJCQkJCQkuaW52b2tlKHNlcnZpY2VRbmFtZUluc3RhbmNlLCBudWxsKTsKLQkJCQkJCXNlcnZpY2VOYW1lQ29tYm8uYWRkKHJlc3VsdExvY2FsUGFydC50b1N0cmluZygpKTsKLQkJCQkJfQotCQkJCQk7Ci0JCQkJCS8vIHNlbGVjdCB0aGUgZmlyc3Qgb25lIGFzIHRoZSBkZWZhdWx0Ci0JCQkJCXNlcnZpY2VOYW1lQ29tYm8uc2VsZWN0KDApOwotCi0JCQkJCS8vIGxvYWQgdGhlIHBvcnRzCi0JCQkJCWxvYWRQb3J0TmFtZXMoKTsKLQotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIHNlcnZpY2UgbmFtZSBsaXN0IGJlaW5nIGVtcHR5IG1lYW5zIHdlIGFyZSBzd2l0Y2hpbmcgdG8KLQkJCQkJLy8gdGhlIGludGVyZmFjZSBtb2RlCi0JCQkJCWlmIChzZXJ2aWNlTmFtZUNvbWJvIT1udWxsKSBzZXJ2aWNlTmFtZUNvbWJvLnJlbW92ZUFsbCgpOwotCQkJCQlpZiAocG9ydE5hbWVDb21ibyE9bnVsbCkgcG9ydE5hbWVDb21iby5yZW1vdmVBbGwoKTsKLQotCQkJCX0KLQotCQkJCXBvcHVsYXRlUGFja2FnZU5hbWUoKTsKLQotCQkJCS8vcG9wdWxhdGUgdGhlIG5hbWVzcGFjZXNzCi0JCQkJbG9hZE5hbWVzcGFjZXMocmVhZGVyLmdldERlZmluaXRpb25OYW1lc3BhY2VNYXAoKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlzdGF0dXMgPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyhOTFMuYmluZCgKLQkJCQkJQXhpczJDb25zdW1wdGlvblVJTWVzc2FnZXMuRVJST1JfSU5WQUxJRF9XU0RMX0ZJTEVfUkVBRF9XUklURUwsCi0JCQkJCW5ldyBTdHJpbmdbXXtlLmdldExvY2FsaXplZE1lc3NhZ2UoKX0pLCBlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBMb2FkcyB0aGUgbmFtZXNwYWNlcwotCSAqIEBwYXJhbSBuYW1lc3BhY2VNYXAKLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZE5hbWVzcGFjZXMoTWFwIG5hbWVzcGFjZU1hcCl7Ci0JCUl0ZXJhdG9yIG5hbWVzcGFjZXMgPSBuYW1lc3BhY2VNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJbmFtZXNwYWNlMnBhY2thZ2VUYWJsZS5yZW1vdmVBbGwoKTsKLSAgICAgICAgVGFibGVJdGVtW10gaXRlbXMgPSBuZXcgVGFibGVJdGVtW25hbWVzcGFjZU1hcC5zaXplKCldOyAvLyBBbiBpdGVtIGZvciBlYWNoIGZpZWxkCi0gICAgICAgIAotICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgIHdoaWxlKG5hbWVzcGFjZXMuaGFzTmV4dCgpKXsKLSAgICAgICAgCQotICAgICAgICAgICBpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0obmFtZXNwYWNlMnBhY2thZ2VUYWJsZSwgU1dULk5VTEwpOwotICAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gKFN0cmluZyluYW1lc3BhY2VzLm5leHQoKTsKLSAgICAgICAgICAgaXRlbXNbaV0uc2V0VGV4dCgwLG5hbWVzcGFjZSk7Ci0gICAgICAgICAgIGl0ZW1zW2ldLnNldFRleHQoMSxnZXRQYWNrYWdlRnJvbU5hbWVzcGFjZShuYW1lc3BhY2UpKTsKLSAgICAgICAgICAgaSsrOwotICAgICAgICB9Ci0KLSAgICAgICAgbmFtZXNwYWNlMnBhY2thZ2VUYWJsZS5zZXRWaXNpYmxlKHRydWUpOwotCQkKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbG9hZFBvcnROYW1lcygpIHsKLQkJaW50IHNlbGVjdGlvbkluZGV4ID0gc2VydmljZU5hbWVDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQlpZiAoc2VsZWN0aW9uSW5kZXggIT0gLTEpIHsKLQkJCWphdmEudXRpbC5MaXN0IHBvcnRzID0gcmVhZGVyLmdldFBvcnROYW1lTGlzdCggc2VydmljZVFOYW1lTGlzdAotCQkJCQkuZ2V0KHNlbGVjdGlvbkluZGV4KSk7Ci0JCQlpZiAoIXBvcnRzLmlzRW1wdHkoKSkgewotCQkJCXBvcnROYW1lQ29tYm8ucmVtb3ZlQWxsKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwb3J0cy5zaXplKCk7IGkrKykgewotCQkJCQkvLyBhZGQgdGhlIGxvY2FsIHBhcnQgb2YgdGhlCi0JCQkJCXBvcnROYW1lQ29tYm8uYWRkKHBvcnRzLmdldChpKS50b1N0cmluZygpKTsKLQkJCQl9Ci0JCQkJcG9ydE5hbWVDb21iby5zZWxlY3QoMCk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIGVycm9yIG5vIHBvcnRzIGZvdW5kCi0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBwYWNrYWdlIGRlcml2ZWQgYnkgIE5hbWVzcGFjZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZUZyb21OYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSl7Ci0JCS8vIFVzZSByZWZsZWN0aW9uIHRvIGludm9rZSBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVVJMUHJvY2Vzc29yIAotCQkvLyBtYWtlUGFja2FnZU5hbWUobmFtZXNwYWNlKSBzdGF0aWNhbGx5Ci0JCU9iamVjdCBzdHJpbmdSZXR1cm4gPSBudWxsOwotCQl0cnkgewotCQkJQ2xhc3MgVVJMUHJvY2Vzc29yQ2xhc3MgPSBDbGFzc0xvYWRpbmdVdGlsCi0JCQkJCS5sb2FkQ2xhc3NGcm9tQW50Q2xhc3NMb2FkZXIoIm9yZy5hcGFjaGUuYXhpczIudXRpbC5VUkxQcm9jZXNzb3IiKTsKLQkJCU1ldGhvZCBtYWtlUGFja2FnZU5hbWVNZXRob2QgPSBVUkxQcm9jZXNzb3JDbGFzcwotCQkJCQkuZ2V0TWV0aG9kKCJtYWtlUGFja2FnZU5hbWUiLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9KTsKLQkJCXN0cmluZ1JldHVybiA9IG1ha2VQYWNrYWdlTmFtZU1ldGhvZC5pbnZva2UobnVsbCwgbmV3IE9iamVjdFtde25hbWVzcGFjZX0pOwotCQl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiAgKFN0cmluZylzdHJpbmdSZXR1cm47Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpczIvY29uc3VtcHRpb24vdWkvd2l6YXJkL2NsaWVudC9XZWJTZXJ2aWNlQ2xpZW50QXhpczJUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMyL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9jbGllbnQvV2ViU2VydmljZUNsaWVudEF4aXMyVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGNmZjY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpczIvY29uc3VtcHRpb24vdWkvd2l6YXJkL2NsaWVudC9XZWJTZXJ2aWNlQ2xpZW50QXhpczJUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBXU08yIEluYy4gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogV1NPMiBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDcwMTMwICAgMTY4NzYyIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgY29kZSB0byBpbnRyb2R1c2UgdGhlIEF4aXMyIAotICogCQkJCQkJCQkJCSAgcnVudGltZSB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjIKLSAqIDIwMDcwNDI2ICAgMTgzMDQ2IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpczIuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLmRhdGEuRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLm1lc3NhZ2VzLkF4aXMyQ29uc3VtcHRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzMi5jb25zdW1wdGlvbi51aS53aWRnZXRzLkF4aXMyUHJveHlXaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LlNpbXBsZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLkNhbkZpbmlzaFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXRSZWdpc3RyeTsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VDbGllbnRBeGlzMlR5cGUgaW1wbGVtZW50cyBDb21tYW5kV2lkZ2V0QmluZGluZyB7Ci0JCi0JRGF0YU1vZGVsIG1vZGVsOwotCQotCXB1YmxpYyBXZWJTZXJ2aWNlQ2xpZW50QXhpczJUeXBlKERhdGFNb2RlbCBtb2RlbCl7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQl9Ci0KLQkKLQkgIC8qIChub24tSmF2YWRvYykKLQkgICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJEYXRhTWFwcGluZ3MKLQkgICAqIChvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnkpCi0JICAgKi8KLQkgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KSB7Ci0JICAJLy8gQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kICAJCi0JICAgIC8vIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBBeGlzMkNsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAKLQkJLy8gIkN1c3RvbWl6ZUNsaWVudE1hcHBpbmdzIiwgQXhpczJQcm94eVdpZGdldC5jbGFzcyApOwotCSAgICAKLQkgIH0KLQkgIAotCSAgLyogKG5vbi1KYXZhZG9jKQotCSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlcldpZGdldE1hcHBpbmdzCi0JICAgKiAob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0UmVnaXN0cnkpCi0JICAgKi8KLQkgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyV2lkZ2V0TWFwcGluZ3MoV2lkZ2V0UmVnaXN0cnkgd2lkZ2V0UmVnaXN0cnkpIHsKLQkgICAKLQkgICAgd2lkZ2V0UmVnaXN0cnkuYWRkKCAiQXhpc0NsaWVudFN0YXJ0IiwgCi0JICAgICAgICBBeGlzMkNvbnN1bXB0aW9uVUlNZXNzYWdlcy5QQUdFX1RJVExFX1dTX0FYSVMyX1BST1hZLAotCSAgICAgICAgQXhpczJDb25zdW1wdGlvblVJTWVzc2FnZXMuUEFHRV9ERVNDX1dTX0FYSVMyX1BST1hZLAotCSAgICAgICAgbmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpCi0JICAgICAgICB7Ci0JICAgICAgICAgIHB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKQotCSAgICAgICAgICB7Ci0JICAgICAgICAgICAgcmV0dXJuIG5ldyBBeGlzMlByb3h5V2lkZ2V0KG1vZGVsKTsKLQkgICAgICAgICAgfQotCSAgICAgICAgfSApOwotCSAgICAKLQkgICAgLy93aWRnZXRSZWdpc3RyeS5hZGQoICJBeGlzQ2xpZW50QmVhbk1hcHBpbmciLCAKLQkgICAgLy8gICAgQXhpczJDb25zdW1wdGlvblVJTWVzc2FnZXMuUEFHRV9USVRMRV9XU19YTUwyUFJPWFksCi0JICAgIC8vICAgIEF4aXMyQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkxBQkVMX0VYUExPUkVfTUFQUElOR1NfWE1MMkJFQU4sCi0JICAgIC8vICAgIG5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKQotCSAgICAvLyAgICB7Ci0JICAgIC8vICAgICAgcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpCi0JICAgIC8vICAgICAgewotCSAgICAvLyAgICAgICAgcmV0dXJuIG5ldyBBeGlzTWFwcGluZ3NXaWRnZXQoQXhpc01hcHBpbmdzV2lkZ2V0Lk1PREVfWE1MMlBST1hZICk7Ci0JICAgIC8vICAgICAgfQotCSAgICAvLyAgICB9ICk7Ci0JICB9Ci0JICAKLQkgIC8qIChub24tSmF2YWRvYykKLQkgICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQKLQkgICAqIC5Db21tYW5kRnJhZ21lbnRGYWN0b3J5RmFjdG9yeSNjcmVhdGUoKQotCSAgICovCi0JICBwdWJsaWMgQ29tbWFuZEZyYWdtZW50RmFjdG9yeSBjcmVhdGUoKSAKLQkgIHsKLQkgICAgcmV0dXJuIG5ldyBDb21tYW5kRnJhZ21lbnRGYWN0b3J5KCkKLQkgICAgICAgICAgIHsKLQkgICAgICAgICAgICAgcHVibGljIENvbW1hbmRGcmFnbWVudCBjcmVhdGUoKQotCSAgICAgICAgICAgICB7Ci0JICAgICAgICAgICAgICAgLy9kZWFkIGNvZGUgLSBkb2Vzbid0IG1hdHRlciB3aGF0IGdldHMgcmV0dXJuZWQgaGVyZS4KLQkgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNpbXBsZUZyYWdtZW50KCk7Ci0JICAgICAgICAgICAgIH0KLQkgICAgICAgICAgIH07Ci0JICB9Ci0JICAvKiAobm9uLUphdmFkb2MpCi0JICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyQ2FuRmluaXNoCi0JICAgKiAob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ2FuRmluaXNoUmVnaXN0cnkpCi0JICAgKi8KLQkgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyQ2FuRmluaXNoKENhbkZpbmlzaFJlZ2lzdHJ5IGNhbkZpbmlzaFJlZ2lzdHJ5KXsKLQkgIH0KLQkgIAotCSAgcHVibGljIHZvaWQgc2V0V2ViU2VydmljZURhdGFNb2RlbCggRGF0YU1vZGVsIG1vZGVsICl7Ci0JCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMyL2NvbnN1bXB0aW9uL3VpL3dzcnQvQXhpczJDbGllbnRDb25maWdXaWRnZXRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMyL2NvbnN1bXB0aW9uL3VpL3dzcnQvQXhpczJDbGllbnRDb25maWdXaWRnZXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMTQ3MWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzMi9jb25zdW1wdGlvbi91aS93c3J0L0F4aXMyQ2xpZW50Q29uZmlnV2lkZ2V0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBXU08yIEluYy4gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogV1NPMiBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDcwMjMwICAgMTY4NzYyIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgY29kZSB0byBpbnRyb2R1c2UgdGhlIEF4aXMyIAotICogCQkJCQkJCQkJCSAgcnVudGltZSB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjIKLSAqIDIwMDcwNDI2ICAgMTgzMDQ2IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgKLSAqIDIwMDcwNjAxICAgMTkwNTA1IHBtb29na0BjYS5pYm0uY29tIC0gUGV0ZXIgTW9vZ2sKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpczIuY29uc3VtcHRpb24udWkud3NydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLmNvbW1hbmQuQXhpczJDbGllbnREZWZhdWx0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS5kYXRhLkRhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpczIuY29uc3VtcHRpb24udWkud2lkZ2V0cy5BeGlzMlByb3h5V2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzMi5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LldlYlNlcnZpY2VDbGllbnRBeGlzMlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLklOYW1lZFdpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLklOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXRCaW5kaW5nVG9XaWRnZXRGYWN0b3J5QWRhcHRlcjsKLQotcHVibGljIGNsYXNzIEF4aXMyQ2xpZW50Q29uZmlnV2lkZ2V0RmFjdG9yeSBpbXBsZW1lbnRzIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeXsKLQlwcml2YXRlIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yICAgICAgICAgICAgIHByb3h5Q29uZmlnV2lkZ2V0OwotCXByaXZhdGUgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3IgICAgICAgICAgICAgbWFwcGluZ3NXaWRnZXQ7Ci0JcHJpdmF0ZSBBeGlzMlByb3h5V2lkZ2V0ICAgICAgICAgICAgICAgICAgICAgcHJveHlXaWRnZXQ7Ci0JcHJpdmF0ZSBXaWRnZXRCaW5kaW5nVG9XaWRnZXRGYWN0b3J5QWRhcHRlciBhZGFwdGVyOwotCXByaXZhdGUgRGF0YU1vZGVsIAkJCQkJCQltb2RlbDsKLQlwcml2YXRlIFdlYlNlcnZpY2VDbGllbnRBeGlzMlR5cGUgICAgICAgICAgIHdzQ2xpZW50QXhpczJUeXBlOwotCXByaXZhdGUgRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnk7Ci0JCi0JcHVibGljIEF4aXMyQ2xpZW50Q29uZmlnV2lkZ2V0RmFjdG9yeSgpewotCX0KLQkKLQlwdWJsaWMgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3IgZ2V0Rmlyc3ROYW1lZFdpZGdldCgpIHsKLQkJaW5pdCgpOwotCQkvL3dzQ2xpZW50QXhpczJUeXBlLnNldFdlYlNlcnZpY2VEYXRhTW9kZWwobW9kZWwpOwotCQlyZXR1cm4gcHJveHlDb25maWdXaWRnZXQ7Ci0JfQotCi0JcHVibGljIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIGdldE5leHROYW1lZFdpZGdldCggSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3Igd2lkZ2V0Q29udHJpYnV0b3IpIHsKLQkgIHJldHVybiB3aWRnZXRDb250cmlidXRvciA9PSBwcm94eUNvbmZpZ1dpZGdldCAmJiBwcm94eVdpZGdldC5pc0dlblByb3h5KCkgCi0JICAJCQkJCQkJCT8gbWFwcGluZ3NXaWRnZXQgCi0JICAJCQkJCQkJCTogbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpIHsKLQkJdGhpcy5kYXRhUmVnaXN0cnk9ZGF0YVJlZ2lzdHJ5OwotCQkvLyBNYXAgdGhlIGRhdGEgbW9kZWwgZnJvbSB0aGUgZGVmYXVsdGluZyBjb21tYW5kIHRvIHRoaXMgd2lkZ2V0IGZhY3RvcnkuCi0JCS8vIFRoZSBmcmFtZXdvcmsgd2lsbCBhY3R1YWxseSB0byB0aGUgY2FsbCB0byBnZXRXZWJTZXJ2aWNlRGF0YU1vZGVsIGluCi0JCS8vIHRoZSBFeGFtcGxlRGVmYXVsdGluZ0NvbW1hbmQgY2xhc3MgYW5kIHRoZW4gY2FsbCB0aGUgc2V0V2ViU2VydmljZURhdGFNb2RlbAotCQkvLyBtZXRob2QgaW4gdGhpcyBjbGFzcy4KLQkJZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIEF4aXMyQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsIAotCQkJCQkJCQkgIldlYlNlcnZpY2VEYXRhTW9kZWwiLCAgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkgQXhpczJDbGllbnRDb25maWdXaWRnZXRGYWN0b3J5LmNsYXNzICk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2VEYXRhTW9kZWwoIERhdGFNb2RlbCBtb2RlbCApewotCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0KCl7Ci0JCSAgd3NDbGllbnRBeGlzMlR5cGUgPSBuZXcgV2ViU2VydmljZUNsaWVudEF4aXMyVHlwZShtb2RlbCk7Ci0JCSAgYWRhcHRlciA9IG5ldyBXaWRnZXRCaW5kaW5nVG9XaWRnZXRGYWN0b3J5QWRhcHRlcih3c0NsaWVudEF4aXMyVHlwZSApOwotCQkgIHByb3h5Q29uZmlnV2lkZ2V0ID0gYWRhcHRlci5nZXRXaWRnZXQoICJBeGlzQ2xpZW50U3RhcnQiICk7IC8vJE5PTi1OTFMtMSQKLQkJICBwcm94eVdpZGdldCAgICAgICA9IChBeGlzMlByb3h5V2lkZ2V0KXByb3h5Q29uZmlnV2lkZ2V0Ci0JCSAgCQkJCS5nZXRXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKS5jcmVhdGUoKTsKLQkJICBtYXBwaW5nc1dpZGdldCAgID0gYWRhcHRlci5nZXRXaWRnZXQoICJBeGlzQ2xpZW50QmVhbk1hcHBpbmciICk7IC8vJE5PTi1OTFMtMSQKLQkJICBhZGFwdGVyLnJlZ2lzdGVyRGF0YU1hcHBpbmdzKCBkYXRhUmVnaXN0cnkgKTsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpczIvY29uc3VtcHRpb24vdWkvd3NydC9BeGlzMldlYlNlcnZpY2VDbGllbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpczIvY29uc3VtcHRpb24vdWkvd3NydC9BeGlzMldlYlNlcnZpY2VDbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJhZThhMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMyL2NvbnN1bXB0aW9uL3VpL3dzcnQvQXhpczJXZWJTZXJ2aWNlQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IFdTTzIgSW5jLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBXU08yIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzAyMzAgICAxNjg3NjIgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgSW5pdGlhbCBjb2RlIHRvIGludHJvZHVzZSB0aGUgQXhpczIgCi0gKiAJCQkJCQkJCQkJICBydW50aW1lIHRvIHRoZSBmcmFtZXdvcmsgZm9yIDE2ODc2MgotICogMjAwNzA1MTggICAxODczMTEgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgRml4aW5nIHRlc3QgcmVzb3VyY2UgYWRkaXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpczIuY29uc3VtcHRpb24udWkud3NydDsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZC5BeGlzMkNsaWVudENvZGVnZW5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLmNvbW1hbmQuQXhpczJDbGllbnREZWZhdWx0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS5jb21tYW5kLkF4aXMyQ2xpZW50VGVzdENhc2VJbnRlZ3JhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLmNvbW1hbmQuQXhpczJXZWJzZXJ2aWNlc1NlcnZlckNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUuZGF0YS5EYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMyLmNvbnN1bXB0aW9uLnVpLnRhc2suRGVmYXVsdHNGb3JIVFRQQmFzaWNBdXRoQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5JQ29tbWFuZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5lY2xpcHNlLkVjbGlwc2VFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5BYnN0cmFjdFdlYlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuSUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5XZWJTZXJ2aWNlQ2xpZW50SW5mbzsKLQotcHVibGljIGNsYXNzIEF4aXMyV2ViU2VydmljZUNsaWVudCBleHRlbmRzIEFic3RyYWN0V2ViU2VydmljZUNsaWVudCB7Ci0KLQlwdWJsaWMgQXhpczJXZWJTZXJ2aWNlQ2xpZW50KFdlYlNlcnZpY2VDbGllbnRJbmZvIGluZm8pIHsKLQkJc3VwZXIoaW5mbyk7Ci0JfQotCi0JcHVibGljIElDb21tYW5kRmFjdG9yeSBhc3NlbWJsZShJRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsCi0JCQlJU2VsZWN0aW9uIGFyZzIsIFN0cmluZyBhcmczLCBTdHJpbmcgYXJnNCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGRlcGxveShJRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsCi0JCQlJU2VsZWN0aW9uIGFyZzIsIFN0cmluZyBhcmczLCBTdHJpbmcgYXJnNCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGRldmVsb3AoSUVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LAotCQkJSVNlbGVjdGlvbiBzZWwsIFN0cmluZyBwcm9qZWN0LCBTdHJpbmcgZWFyUHJvamVjdCkgewotCQlEYXRhTW9kZWwgbW9kZWwgPSBuZXcgRGF0YU1vZGVsKCk7Ci0JCQotCQlFY2xpcHNlRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSAoRWNsaXBzZUVudmlyb25tZW50KWVudjsKLQkJcmVnaXN0ZXJEYXRhTWFwcGluZ3MoIGVudmlyb25tZW50LmdldENvbW1hbmRNYW5hZ2VyKCkuZ2V0TWFwcGluZ1JlZ2lzdHJ5KCkpOwotCQltb2RlbC5zZXRXZWJQcm9qZWN0TmFtZShwcm9qZWN0KTsKLQkJVmVjdG9yIGNvbW1hbmRzID0gbmV3IFZlY3RvcigpOwotCQljb21tYW5kcy5hZGQobmV3IEF4aXMyQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQobW9kZWwsdGhpcykpOwotCQljb21tYW5kcy5hZGQobmV3IEF4aXMyV2Vic2VydmljZXNTZXJ2ZXJDb21tYW5kKG1vZGVsLCBwcm9qZWN0KSk7Ci0JCWNvbW1hbmRzLmFkZChuZXcgQXhpczJDbGllbnRDb2RlZ2VuQ29tbWFuZChtb2RlbCkpOwotCQljb21tYW5kcy5hZGQobmV3IEF4aXMyQ2xpZW50VGVzdENhc2VJbnRlZ3JhdGVDb21tYW5kKAotCQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0KSxtb2RlbCkpOwotCQkKLQkJcmV0dXJuIG5ldyBTaW1wbGVDb21tYW5kRmFjdG9yeShjb21tYW5kcyk7Ci0JfQotCi0JcHVibGljIElDb21tYW5kRmFjdG9yeSBpbnN0YWxsKElFbnZpcm9ubWVudCBlbnYsIElDb250ZXh0IGN0eCwKLQkJCUlTZWxlY3Rpb24gc2VsLCBTdHJpbmcgcHJvamVjdCwgU3RyaW5nIGVhclByb2plY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElDb21tYW5kRmFjdG9yeSBydW4oSUVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LAotCQkJSVNlbGVjdGlvbiBzZWwsIFN0cmluZyBwcm9qZWN0LCBTdHJpbmcgZWFyUHJvamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IHJlZ2lzdHJ5KXsKLQkJLy8gQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kCi0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpczJDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgCi0JCQkJCQkJIldzZGxVUkwiLCAKLQkJCQkJCQlEZWZhdWx0c0ZvckhUVFBCYXNpY0F1dGhDb21tYW5kLmNsYXNzLAotCQkJCQkJCSJXc2RsU2VydmljZVVSTCIsIG51bGwpOyAvL09LCi0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRjNWUzMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTE5ZTE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotYnVpbGQueG1sCi1qYXZhQ29tcGlsZXIuLi5hcmdzCi1AZG90Ci1vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZV8xLjAuMTAyLjIwMDgwNDAyMDIwNC5qYXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjMwZDJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTc3OTNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotI1R1ZSBNYXIgMjAgMTA6NDU6MDQgTEtUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTE1Y2YzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlUExVR0lOX05BTUUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4xMDIucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5wbHVnaW4uV2ViU2VydmljZUF4aXMyQ29yZVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJVBMVUdJTl9QUk9WSURFUgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5hcGFjaGUuYW50LAotIG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUsCi0gb3JnLmVjbGlwc2UuZW1mLmNvbW1vbiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUsCi0gb3JnLmVjbGlwc2UuamVtLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aSwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUuY29uc3RhbnQsCi0gb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUuY29udGV4dCwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5wbHVnaW4sCi0gb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUucGx1Z2luLm1lc3NhZ2VzLAotIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLnV0aWxzCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNzNiZGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYTllMmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgV1NPMiBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0jIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIDIwMDcwNDI2ICAgMTgzMDQ2IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL2ljb25zL2F4aXMyLWZhY2V0LWFkZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL2ljb25zL2F4aXMyLWZhY2V0LWFkZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NjJjZWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9pY29ucy9heGlzMi1mYWNldC1hZGQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9pY29ucy9heGlzMi1mYWNldC5pY28gYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL2ljb25zL2F4aXMyLWZhY2V0LmljbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU1MmExMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL2ljb25zL2F4aXMyLWZhY2V0LmljbworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjg4ZGRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBXU08yIEluYy4gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBXU08yIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSMgLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgMjAwNzA0MDUgICAxNjg3NjIgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgSW5pdGlhbCBjb2RlIHRvIAotIwkJCQkJaW50cm9kdXNlIHRoZSBBeGlzMiBydW50aW1lIHRvIHRoZSBmcmFtZXdvcmsgZm9yIDE2ODc2MgotIyAyMDA3MDUwMSAgIDE4NDYxNyBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBQcm92aWRlIHBsdWdpbiBkZXRhaWxzCi0jIDIwMDgwMTMwICAgMjE2OTk3IGthdGVwQHdzbzIuY29tIC0gS2F0ZSBQcmljZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotCi0jCi0jIE1lc3NhZ2VzIGluIHBsdWdpbi54bWwuCi0jCi1QTFVHSU5fTkFNRT1XZWJzZXJ2aWNlIEF4aXMyIENvcmUgUGx1Zy1pbgotUExVR0lOX1BST1ZJREVSPVdTTzIKLQotQVhJUzJfQ0FUT0dFUllfTEFCRUw9QXhpczIgV2ViIFNlcnZpY2VzCi1BWElTMl9DQVRPR0VSWV9ESVNDUklQVElPTj1FbmFibGVzIFdlYiBzZXJ2aWNlcyBnZW5lcmF0aW9uIHRocm91Z2ggdGhlIEF4aXMyIFdlYiBzZXJ2aWNlcyBlbmdpbmUuCi0KLUFYSVMyX0ZBQ0VUX0NPUkVfTEFCRUw9QXhpczIgV2ViIFNlcnZpY2VzIENvcmUKLUFYSVMyX0ZBQ0VUX0NPUkVfRElTQ1JJUFRJT049UHJlcGFyZXMgdGhlIHByb2plY3QgZm9yIFdlYiBzZXJ2aWNlcyBnZW5lcmF0aW9uIHRocm91Z2ggdGhlIEF4aXMyIFdlYiBzZXJ2aWNlcyBlbmdpbmUuCi0KLQotQVhJUzJfRkFDRVRfRVhUX0xBQkVMPUF4aXMyIFdlYiBTZXJ2aWNlcyBFeHRlbnNpb25zCi1BWElTMl9GQUNFVF9FWFRfRElTQ1JJUFRJT049UHJlcGFyZXMgdGhlIHByb2plY3QgZm9yIGFkZGl0aW9uYWwgV2ViIHNlcnZpY2VzIHN1cHBvcnQgd2l0aCB0aGUgQXhpczIgV2ViIHNlcnZpY2VzIHJ1bnRpbWUuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5YTZkNjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotPHBsdWdpbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmZhY2V0cyI+Ci0JCi0JICA8Y2F0ZWdvcnkgaWQ9ImF4aXMyLmNhdGVnb3J5Ij4KLSAgICAJPGxhYmVsPiVBWElTMl9DQVRPR0VSWV9MQUJFTDwvbGFiZWw+Ci0gICAgCTxkZXNjcmlwdGlvbj4lQVhJUzJfQ0FUT0dFUllfRElTQ1JJUFRJT048L2Rlc2NyaXB0aW9uPgotICAJICA8L2NhdGVnb3J5PgotCi0JCSAgPHByb2plY3QtZmFjZXQgaWQ9ImF4aXMyLmNvcmUiPgotCQkJPGxhYmVsPiVBWElTMl9GQUNFVF9DT1JFX0xBQkVMPC9sYWJlbD4KLQkJCTxkZXNjcmlwdGlvbj4lQVhJUzJfRkFDRVRfQ09SRV9ESVNDUklQVElPTjwvZGVzY3JpcHRpb24+Ci0JCQk8bWVtYmVyIGNhdGVnb3J5PSJheGlzMi5jYXRlZ29yeSAiLz4KLQkJICA8L3Byb2plY3QtZmFjZXQ+Ci0KLQkJPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iYXhpczIuY29yZSIgdmVyc2lvbj0iMS4xIj4KLQkJICAgIDxjb25zdHJhaW50PgotICAgICAgCQkJPHJlcXVpcmVzIGZhY2V0PSJqc3Qud2ViIiB2ZXJzaW9uPSIyLjIsMi4zLDIuNCwyLjUiLz4KLSAgICAJCTwvY29uc3RyYWludD4KLSAgICAJCTxhY3Rpb24gdHlwZT0iSU5TVEFMTCI+Ci0gICAgICAJCQk8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5mYWNldC5kZWxpZ2F0ZS5BeGlzMkNvcmVGYWNldEluc3RhbGxEZWxlZ2F0ZSIvPgotICAgIAkJPC9hY3Rpb24+Ci08IS0tCi0gICAgCQk8YWN0aW9uIHR5cGU9IlVOSU5TVEFMTCI+Ci0gICAgICAJCQk8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5mYWNldC5kZWxpZ2F0ZS5BeGlzMkNvcmVGYWNldFVuSW5zdGFsbERlbGVnYXRlIi8+Ci0gICAgCQk8L2FjdGlvbj4KLS0tPgotICAJCTwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotCi0JCSAgPHByb2plY3QtZmFjZXQgaWQ9ImF4aXMyLmV4dCI+Ci0JCQk8bGFiZWw+JUFYSVMyX0ZBQ0VUX0VYVF9MQUJFTDwvbGFiZWw+Ci0JCQk8ZGVzY3JpcHRpb24+JUFYSVMyX0ZBQ0VUX0VYVF9ESVNDUklQVElPTjwvZGVzY3JpcHRpb24+Ci0JCQk8bWVtYmVyIGNhdGVnb3J5PSJheGlzMi5jYXRlZ29yeSIgLz4KLQkJICA8L3Byb2plY3QtZmFjZXQ+Ci0KLQkJPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iYXhpczIuZXh0IiB2ZXJzaW9uPSIxLjEiPgotCQkgICAgPGNvbnN0cmFpbnQ+Ci0gICAgICAJCQk8cmVxdWlyZXMgZmFjZXQ9ImF4aXMyLmNvcmUiIHZlcnNpb249IjEuMSIvPgotICAgIAkJPC9jb25zdHJhaW50PgotICAgIAkJPGFjdGlvbiB0eXBlPSJJTlNUQUxMIj4KLSAgICAgIAkJCTxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmZhY2V0LmRlbGlnYXRlLkF4aXMyRXh0RmFjZXRJbnN0YWxsRGVsZWdhdGUiLz4KLSAgICAJCTwvYWN0aW9uPgotPCEtLQotICAgIAkJPGFjdGlvbiB0eXBlPSJVTklOU1RBTEwiPgotICAgICAgCQkJPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuZmFjZXQuZGVsaWdhdGUuQXhpczJFeHRGYWNldFVuSW5zdGFsbERlbGVnYXRlIi8+Ci0gICAgCQk8L2FjdGlvbj4KLS0tPgotICAJCTwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotICAKLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW1hZ2VzIj4KLSAgCQk8aW1hZ2UgZmFjZXQ9ImF4aXMyLmNvcmUiIHBhdGg9Imljb25zL2F4aXMyLWZhY2V0LWFkZC5naWYiLz4KLSAgCQk8aW1hZ2UgZmFjZXQ9ImF4aXMyLmV4dCIgcGF0aD0iaWNvbnMvYXhpczItZmFjZXQtYWRkLmdpZiIvPgotICAJCTxpbWFnZSBjYXRlZ29yeT0iYXhpczIuY2F0ZWdvcnkiIHBhdGg9Imljb25zL2F4aXMyLWZhY2V0LmljbyIvPgotCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24KLSAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZXMiPgotICAgIDxzdXBwb3J0ZWQ+Ci0gICAgICA8cnVudGltZS1jb21wb25lbnQKLSAgICAgICAgIGFueT0idHJ1ZSIvPgotICAgICAgPGZhY2V0Ci0gICAgICAgICBpZD0iYXhpczIuY29yZSIKLSAgICAgICAgIHZlcnNpb249IjEuMSIvPgotICAgICAgPGZhY2V0Ci0gICAgICAgICBpZD0iYXhpczIuZXh0IgotICAgICAgICAgdmVyc2lvbj0iMS4xIi8+Ci0gICAgPC9zdXBwb3J0ZWQ+Ci0gICA8L2V4dGVuc2lvbj4KLQotCi08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29yZS9jb25zdGFudC9BeGlzMkNvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NvcmUvY29uc3RhbnQvQXhpczJDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUxNzI1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29yZS9jb25zdGFudC9BeGlzMkNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBXU08yIEluYy4gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogV1NPMiBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDcwODI0ICAgMjAwNTE1IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIE5PTi1OTFMgbW92ZSB0byBzZXBlcmF0ZSBmaWxlCi0gKiAyMDA3MTAxMSAgIDIwNTk3MiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBBeGlzMiBMaWJyYXJpZXMgTGljZW5zZSBmaWxlcyBmaXgKLSAqIDIwMDcxMDI5ICAgMjA2OTY3IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5jb25zdGFudDsKLQotcHVibGljIGNsYXNzIEF4aXMyQ29uc3RhbnRzIHsKLQkKLQkvL0F4aXMyIENvcmUgUGx1Z2luIENvbnN0YW50cyAgCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJUl9URU1QV0FSPSJ0ZW1wd2FyIjsJCQkJCQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJUl9FWFBMT0FERURfVEVNUFdBUj0iZXhwbG9hZGVkd2FyIjsJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElSX0xJQj0ibGliIjsJCQkJCQkJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElSX1RFU1Q9InRlc3QiOwkJCQkJCQkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX0FYSVMyX1dBUj0iYXhpczIud2FyIjsJCQkJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgIE5VTEw9IiI7CQkJCQkJCQkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBREI9ImFkYiI7CQkJCQkJCQkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQVI9ImFhciI7CQkJCQkJCQkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVI9ImphciI7CQkJCQkJCQkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWFQ9InR4dCI7CQkJCQkJCQkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURU1QX0FYSVMyX0ZBQ0VUX0RJUj0ib3JnLmFwYWNoZS5heGlzMi5mYWNldCI7CS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVJfRE9UX01FVEFEQVRBPSIubWV0YWRhdGEiOwkJCQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJUl9ET1RfUExVR0lOUz0iLnBsdWdpbnMiOwkJCQkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVJfVU5aSVA9Im56aXAiOwkJCQkJCQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FMX1NFUlZFUl9QT1JUPSJodHRwOi8vbG9jYWxob3N0OjgwODAiOwkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VTPSJzZXJ2aWNlcyI7CQkJCQkJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCQVBQX0VYUExPREVEX1NFUlZFUl9MT0NBVElPTl9GSUxFPQotCQkJInNlcnZlci5wcm9wZXJ0aWVzIjsJCQkJCQkJCQkJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkVSX1NUQVRVU19MT0NBVElPTl9GSUxFPSJzdGF0dXMucHJvcGVydGllcyI7CS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXQVJfU1RBVFVTX0xPQ0FUSU9OX0ZJTEU9Indhci5wcm9wZXJ0aWVzIjsJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9LRVlfUEFUSD0icGF0aCI7CQkJCQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0tFWV9TVEFUVVM9InN0YXR1cyI7CQkJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkVSX1NUQVRVU19QQVNTPSJwYXNzIjsJCQkJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkVSX1NUQVRVU19GQUlMPSJmYWlsIjsJCQkJCQkvLyROT04tTkxTLTEkCi0JCi0JLy9BeGlzMiBDcmVhdGlvbiBQbHVnaW4gQ29uc3RhbnRzIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfU0VSVklDRVNfWE1MPSJzZXJ2aWNlcy54bWwiOwkJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9YTUw9IioueG1sIjsJCQkJCQkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVJfTUVUQV9JTkY9Ik1FVEEtSU5GIjsJCQkJCQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJUl9CVUlMRD0iYnVpbGQiOwkJCQkJCQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJUl9TUkM9InNyYyI7CQkJCQkJCQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJUl9DTEFTU0VTPSJjbGFzc2VzIjsJCQkJCQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJUl9SRVNPVVJDRVM9InJlc291cmNlcyI7CQkJCQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJUl9XRUJfSU5GPSJXRUItSU5GIjsJCQkJCQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJUl9TRVJWSUNFUz0ic2VydmljZXMiOwkJCQkJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElSX1dFQlNFUlZJQ0VTPSJ3ZWJzZXJ2aWNlcyI7CQkJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElSX1dFQkNPTlRFTlQ9IldlYkNvbnRlbnQiOwkJCQkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVJfVEFTSz0iamFyIjsJCQkJCQkJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVhJUzJfUFJPSkVDVD0ib3JnLmVjbGlwc2UuanN0LndzLmF4aXMyIjsJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0RFR0VOX1JFU1VMVFM9ImNvZGVnZW4iOwkJCQkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX0JJTkRJTkdfQURCPSJBREIiOwkJCQkJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9CSU5ESU5HX05PTkU9Ik5PTkUiOwkJCQkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTS0VMRVRPTl9TVUZGSVg9IlNrZWxldG9uLmphdmEiOwkJCQkJLy8kTk9OLU5MUy0xJAotCQotCQotCS8vQXhpczIgQ29uc3VtcHRpb24gUGx1Z2luIENvbnN0YW50cyAgCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlVOSVRfSkFSPSJqdW5pdC5qYXIiOwkJCQkJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlVOSVRfQlVORExFPSJvcmcuanVuaXQiOwkJCQkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVJfQVhJUzJfV0VCPSJheGlzMi13ZWIiOwkJCQkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX1dFQl9YTUw9IndlYi54bWwiOwkJCQkJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9TRVJWTEVUX0FQST0ic2VydmxldGFwaSI7CQkJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBBWElTMl9MSUJfUFJFRklYRVMgPSB7CQkJCQkJCS8vJE5PTi1OTFMtMSQKLSAgICAgICAgImFudCIsCi0gICAgICAgICJheGlvbSIsCi0gICAgICAgICJheGlzMiIsCi0gICAgICAgICJjb21tb25zIiwKLSAgICAgICAgImxvZzRqIiwKLSAgICAgICAgIm5lZXRoaSIsCi0gICAgICAgICJzdGF4IiwKLSAgICAgICAgIndzZGw0aiIsCi0gICAgICAgICJ3c3R4IiwKLSAgICAgICAgInhiZWFuIiwKLSAgICAgICAgIlhtbFNjaGVtYSIsCi0gICAgICAgICJ3b2RlbiIsCi0gICAgICAgICJhY3RpdmF0aW9uIiwKLSAgICAgICAgImFubm9nZW4iLAotICAgICAgICAiYmFja3BvcnQtdXRpbCIsCi0gICAgICAgICJtZXgtaW1wbCIsCi0gICAgICAgICJtYWlsIgotCX07Ci19CQotCQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NvcmUvY29udGV4dC9BeGlzMkVtaXR0ZXJDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29yZS9jb250ZXh0L0F4aXMyRW1pdHRlckNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q3MjE3Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29yZS9jb250ZXh0L0F4aXMyRW1pdHRlckNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogV1NPMiBJbmMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzA1MTYgICAxODMxNDcgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCBGaXggZm9yIHRoZSBwZXJzaXN0aW5nIERCQ1MgcGF0aHMKLSAqIDIwMDcwNTIzICAgMTc0ODc2IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIFBlcnNpc3QgUHJlZmVyZW5jZXMgaW5zaWRlIEZyYW1ld29yawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5jb250ZXh0OwotCi1wdWJsaWMgaW50ZXJmYWNlIEF4aXMyRW1pdHRlckNvbnRleHQgewotCi0JLyoqCi0JICogVGhpcyBjb25zdGFudCBzdHJpbmcgaXMgdXNlZCB0byBsb29rdXAgdGhlIHJ1bnRpbWUgbG9jYXRpb24gZ2VuZXJhbAotCSAqIHByZWZlcmVuY2UgZnJvbSB0aGUgcGx1Z2lucyBsb2NhbCBwcmVmZXJlbmNlcyBzdG9yZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0FYSVMyX1JVTlRJTUVfTE9DQVRJT04gPSAiYXhpczJSdW50aW1lTG9jYXRpb24iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfQVhJUzJfU0VSVkVSX0lTX1dBUiA9ICJheGlzMlNlcnZlclBhdGhSZXByZXNlbnRzV2FyIjsKLQkvL0F4aXMyIFByZWZlcmVuY2VzCi0JLy9TZXJ2aWNlIENvZGUgZ2VuZXJhdGlvbiBPcHRpb25zCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9TRVJWSUNFX0RBVEFCSU5ESU5HID0gInNlcnZpY2VEYXRhYmluZGluZyI7IAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfU0VSVklDRV9JTlRFUkZBQ0VfU0tFTEVUT04gPSAic2VydmljZUludGVyZmFjZVNrZWxldG9uIjsgCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9TRVJWSUNFX0dFTkVSQVRFX0FMTCA9ICJzZXJ2aWNlR2VuZXJhdGVBbGwiOyAKLQkKLQkvL0NsaWVudCBDb2RlIGdlbmVyYXRpb24gT3B0aW9ucwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfQ0xJRU5UX1NZTkMgPSAic3luYyI7IAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfQ0xJRU5UX0FTWU5DID0gImFzeW5jIjsgCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9DTElFTlRfREFUQUJJTkRJTkcgPSAiY2xlaW50RGF0YWJpbmRpbmciOyAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0NMSUVOVF9URVNUQ0FTRSA9ICJjbGllbnRUZXN0Y2FzZSI7IAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfQ0xJRU5UX0dFTkVSQVRFX0FMTCA9ICJjbGllbnRHZW5lcmF0ZUFsbCI7IAotCQotCS8vU2VydmljZSBBcmNoaXZlIE9wdGlvbnMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0FBUl9FWFRFTlRJT04gID0gImFhckV4dGVudGlvbiI7Ci0KLQkvKioKLQkgKiBAcGFyYW0gc2VsZWN0aW9uIHNldCB0aGUgYXhpczIgcnVudGltZSBsb2NhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBeGlzMlJ1bnRpbWVMb2NhdGlvbihTdHJpbmcgcnVudGltZUxvY2F0aW9uKTsKLQotCS8qKgotCSAqIEBwYXJhbSByZXR1cm5zIHRoZSBheGlzMiBydW50aW1lIGxvY2F0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXhpczJSdW50aW1lTG9jYXRpb24oKTsKLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0F4aXMyU2VydmVyUGF0aFJlcHJlc2VudHNXYXIoKTsKLQotCXB1YmxpYyB2b2lkIHNldEF4aXMyU2VydmVyUGF0aFJlcHJlc2VudHNXYXIoU3RyaW5nIGlzV2FyKTsKLQotCS8vU2VydmljZSBDb2RlIGdlbmVyYXRpb24gT3B0aW9ucwotCi0JcHVibGljIHZvaWQgc2V0U2VydmljZURhdGFiaW5kaW5nKFN0cmluZyBzZXJ2aWNlRGF0YWJpbmRpbmcpOwotCi0JcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlRGF0YWJpbmRpbmcoKTsKLQotCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VJbnRlcmZhY2VTa2VsZXRvbihib29sZWFuIHNlcnZpY2VJbnRlcmZhY2VTa2VsZXRvbik7Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NlcnZpY2VJbnRlcmZhY2VTa2VsZXRvbigpOwotCi0JcHVibGljIHZvaWQgc2V0U2VydmljZUdlbmVyYXRlQWxsKGJvb2xlYW4gc2VydmljZUdlbmVyYXRlQWxsKTsKLQotCXB1YmxpYyBib29sZWFuIGlzU2VydmljZUdlbmVyYXRlQWxsKCk7Ci0KLQotCS8vQ2xpZW50IENvZGUgZ2VuZXJhdGlvbiBPcHRpb25zCi0JcHVibGljIHZvaWQgc2V0U3luYyhib29sZWFuIGNsaWVudFN5bmMpOwotCi0JcHVibGljIGJvb2xlYW4gaXNTeW5jKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRBc3luYyhib29sZWFuIGNsaWVudEFzeW5jKTsKLQotCXB1YmxpYyBib29sZWFuIGlzQXN5bmMoKTsKLQotCXB1YmxpYyB2b2lkIHNldENsaWVudERhdGFiaW5kaW5nKFN0cmluZyBjbGllbnREYXRhYmluZGluZyk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENsaWVudERhdGFiaW5kaW5nKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRDbGllbnRUZXN0Q2FzZShib29sZWFuIGNsaWVudFRlc3RDYXNlKTsKLQotCXB1YmxpYyBib29sZWFuIGlzQ2xpZW50VGVzdENhc2UoKTsKLQotCXB1YmxpYyB2b2lkIHNldENsaWVudEdlbmVyYXRlQWxsKGJvb2xlYW4gY2xpZW50R2VuZXJhdGVBbGwpOwotCi0JcHVibGljIGJvb2xlYW4gaXNDbGllbnRHZW5lcmF0ZUFsbCgpOwotCi0JLy9BQVIgT3B0aW9ucwotCXB1YmxpYyB2b2lkIHNldEFhckV4dGVudGlvbihTdHJpbmcgYWFyRXh0ZW50aW9uKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QWFyRXh0ZW50aW9uKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb3JlL2NvbnRleHQvQXhpczJFbWl0dGVyRGVmYXVsdHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb3JlL2NvbnRleHQvQXhpczJFbWl0dGVyRGVmYXVsdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZhYzljOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29yZS9jb250ZXh0L0F4aXMyRW1pdHRlckRlZmF1bHRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IFdTTzIgSW5jIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDcwNTE2ICAgMTgzMTQ3IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGggRml4IGZvciB0aGUgcGVyc2lzdGluZyBEQkNTIHBhdGhzCi0gKiAyMDA3MDUyMyAgIDE3NDg3NiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBQZXJzaXN0IFByZWZlcmVuY2VzIGluc2lkZSBGcmFtZXdvcmsKLSAqIDIwMDcwODI0ICAgMjAwNTE1IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIE5PTi1OTFMgbW92ZSB0byBzZXBlcmF0ZSBmaWxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5jb25zdGFudC5BeGlzMkNvbnN0YW50czsKLQotcHVibGljIGNsYXNzIEF4aXMyRW1pdHRlckRlZmF1bHRzIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfQVhJUzJfUlVOVElNRV9MT0NBVElPTl9ERUZBVUxUID0gIiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIFBSRUZFUkVOQ0VfQVhJUzJfU0VSVkVSX0lTX1dBUiA9IGZhbHNlOwotCi0JLy9BeGlzMiBQcmVmZXJlbmNlcwotCS8vU2VydmljZSBDb2RlIGdlbmVyYXRpb24gT3B0aW9ucwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfU0VSVklDRV9EQVRBQklORElOR19ERUZBVUxUID0gQXhpczJDb25zdGFudHMuQURCOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBQUkVGRVJFTkNFX1NFUlZJQ0VfSU5URVJGQUNFX1NLRUxFVE9OX0RFRkFVTFQgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gUFJFRkVSRU5DRV9TRVJWSUNFX0dFTkVSQVRFX0FMTF9ERUZBVUxUID0gZmFsc2U7Ci0KLQkvL0NsaWVudCBDb2RlIGdlbmVyYXRpb24gT3B0aW9ucwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBQUkVGRVJFTkNFX0NMSUVOVF9TWU5DX0RFRkFVTFQgPSAgZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIFBSRUZFUkVOQ0VfQ0xJRU5UX0FTWU5DX0RFRkFVTFQgPSAgZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9DTElFTlRfREFUQUJJTkRJTkdfREVGQVVMVCAgPSBBeGlzMkNvbnN0YW50cy5BREI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIFBSRUZFUkVOQ0VfQ0xJRU5UX1RFU1RDQVNFX0RFRkFVTFQgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gUFJFRkVSRU5DRV9DTElFTlRfR0VORVJBVEVfQUxMX0RFRkFVTFQgPSBmYWxzZTsKLQotCS8vU2VydmljZSBBcmNoaXZlIE9wdGlvbnMKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgUFJFRkVSRU5DRV9BQVJfRVhURU5USU9OX0RFRkFVTFQgID0gQXhpczJDb25zdGFudHMuQUFSOwkvL2FhckV4dGVudGlvbgotCi0KLQkvKioKLQkgKiBAcmV0dXJuIHJldHVybnMgdGhlIGRlZmF1bHQgc2V0dGluZyBmb3IgcnVudGltZSBsb2NhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBeGlzMlJ1bnRpbWVMb2NhdGlvbigpIHsKLQkJcmV0dXJuIFBSRUZFUkVOQ0VfQVhJUzJfUlVOVElNRV9MT0NBVElPTl9ERUZBVUxUOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBeGlzMlNlcnZlclBhdGhSZXByZXNlbnRzV2FyKCkgewotCQlyZXR1cm4gUFJFRkVSRU5DRV9BWElTMl9TRVJWRVJfSVNfV0FSOwotCX0KLQotCi0JLy9TZXJ2aWNlIENvZGUgZ2VuZXJhdGlvbiBPcHRpb25zCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTZXJ2aWNlRGF0YWJpbmRpbmcoKXsKLQkJcmV0dXJuIFBSRUZFUkVOQ0VfU0VSVklDRV9EQVRBQklORElOR19ERUZBVUxUOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NlcnZpY2VJbnRlcmZhY2VTa2VsZXRvbigpewotCQlyZXR1cm4gUFJFRkVSRU5DRV9TRVJWSUNFX0lOVEVSRkFDRV9TS0VMRVRPTl9ERUZBVUxUOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NlcnZpY2VHZW5lcmF0ZUFsbCgpewotCQlyZXR1cm4gUFJFRkVSRU5DRV9TRVJWSUNFX0dFTkVSQVRFX0FMTF9ERUZBVUxUOwotCX0KLQotCi0JLy9DbGllbnQgQ29kZSBnZW5lcmF0aW9uIE9wdGlvbnMKLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NsaWVudFN5bmMoKXsKLQkJcmV0dXJuIFBSRUZFUkVOQ0VfQ0xJRU5UX1NZTkNfREVGQVVMVDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDbGllbnRBc3luYygpewotCQlyZXR1cm4gUFJFRkVSRU5DRV9DTElFTlRfQVNZTkNfREVGQVVMVDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDbGllbnREYXRhYmluZGluZygpewotCQlyZXR1cm4gUFJFRkVSRU5DRV9DTElFTlRfREFUQUJJTkRJTkdfREVGQVVMVDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDbGllbnRUZXN0Q2FzZSgpewotCQlyZXR1cm4gUFJFRkVSRU5DRV9DTElFTlRfVEVTVENBU0VfREVGQVVMVDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDbGllbnRHZW5lcmF0ZUFsbCgpewotCQlyZXR1cm4gUFJFRkVSRU5DRV9DTElFTlRfR0VORVJBVEVfQUxMX0RFRkFVTFQ7Ci0JfQotCi0JLy9TZXJ2aWNlIEFBUiBPcHRpb25zCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QWFyRXh0ZW50aW9uKCl7Ci0JCXJldHVybiBQUkVGRVJFTkNFX0FBUl9FWFRFTlRJT05fREVGQVVMVDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb3JlL2NvbnRleHQvUGVyc2lzdGVudEF4aXMyRW1pdHRlckNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb3JlL2NvbnRleHQvUGVyc2lzdGVudEF4aXMyRW1pdHRlckNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI2ZmUxYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29yZS9jb250ZXh0L1BlcnNpc3RlbnRBeGlzMkVtaXR0ZXJDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBXU08yIEluYyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBXU08yIEluYyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDUxNiAgIDE4MzE0NyBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoIEZpeCBmb3IgdGhlIHBlcnNpc3RpbmcgREJDUyBwYXRocwotICogMjAwNzA1MjMgICAxNzQ4NzYgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgUGVyc2lzdCBQcmVmZXJlbmNlcyBpbnNpZGUgRnJhbWV3b3JrCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5wbHVnaW4uV2ViU2VydmljZUF4aXMyQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29udGV4dC5QZXJzaXN0ZW50Q29udGV4dDsKLQotcHVibGljIGNsYXNzIFBlcnNpc3RlbnRBeGlzMkVtaXR0ZXJDb250ZXh0IGV4dGVuZHMgUGVyc2lzdGVudENvbnRleHQgaW1wbGVtZW50cwotCQlBeGlzMkVtaXR0ZXJDb250ZXh0IHsKLQotCXByaXZhdGUgc3RhdGljIFBlcnNpc3RlbnRBeGlzMkVtaXR0ZXJDb250ZXh0IGNvbnRleHRfID0gbnVsbDsKLQotCXB1YmxpYyBzdGF0aWMgUGVyc2lzdGVudEF4aXMyRW1pdHRlckNvbnRleHQgZ2V0SW5zdGFuY2UoKSAKLQl7Ci0JCWlmIChjb250ZXh0XyA9PSBudWxsKSB7Ci0JCQljb250ZXh0XyA9IG5ldyBQZXJzaXN0ZW50QXhpczJFbWl0dGVyQ29udGV4dCgpOwotCQkJY29udGV4dF8ubG9hZCgpOwotCQl9Ci0JCXJldHVybiBjb250ZXh0XzsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbG9hZCgpewotCQlzZXREZWZhdWx0KFBSRUZFUkVOQ0VfQVhJUzJfUlVOVElNRV9MT0NBVElPTiwgQXhpczJFbWl0dGVyRGVmYXVsdHMuZ2V0QXhpczJSdW50aW1lTG9jYXRpb24oKSk7Ci0JCXNldERlZmF1bHQoUFJFRkVSRU5DRV9BWElTMl9TRVJWRVJfSVNfV0FSLCBBeGlzMkVtaXR0ZXJEZWZhdWx0cy5pc0F4aXMyU2VydmVyUGF0aFJlcHJlc2VudHNXYXIoKSk7Ci0JCS8vc2VydmljZSBkZWZhdWx0cwotCQlzZXREZWZhdWx0KFBSRUZFUkVOQ0VfU0VSVklDRV9EQVRBQklORElORywgQXhpczJFbWl0dGVyRGVmYXVsdHMuZ2V0U2VydmljZURhdGFiaW5kaW5nKCkpOwotCQlzZXREZWZhdWx0KFBSRUZFUkVOQ0VfU0VSVklDRV9JTlRFUkZBQ0VfU0tFTEVUT04sIEF4aXMyRW1pdHRlckRlZmF1bHRzLmlzU2VydmljZUludGVyZmFjZVNrZWxldG9uKCkpOwotCQlzZXREZWZhdWx0KFBSRUZFUkVOQ0VfU0VSVklDRV9HRU5FUkFURV9BTEwsIEF4aXMyRW1pdHRlckRlZmF1bHRzLmlzU2VydmljZUdlbmVyYXRlQWxsKCkpOwotCQkvL2NsaWVudCBkZWZhdWx0cwotCQlzZXREZWZhdWx0KFBSRUZFUkVOQ0VfQ0xJRU5UX1NZTkMsIEF4aXMyRW1pdHRlckRlZmF1bHRzLmlzQ2xpZW50U3luYygpKTsKLQkJc2V0RGVmYXVsdChQUkVGRVJFTkNFX0NMSUVOVF9BU1lOQywgQXhpczJFbWl0dGVyRGVmYXVsdHMuaXNDbGllbnRBc3luYygpKTsKLQkJc2V0RGVmYXVsdChQUkVGRVJFTkNFX0NMSUVOVF9EQVRBQklORElORywgQXhpczJFbWl0dGVyRGVmYXVsdHMuZ2V0Q2xpZW50RGF0YWJpbmRpbmcoKSk7Ci0JCXNldERlZmF1bHQoUFJFRkVSRU5DRV9DTElFTlRfVEVTVENBU0UsIEF4aXMyRW1pdHRlckRlZmF1bHRzLmlzQ2xpZW50VGVzdENhc2UoKSk7Ci0JCXNldERlZmF1bHQoUFJFRkVSRU5DRV9DTElFTlRfR0VORVJBVEVfQUxMLCBBeGlzMkVtaXR0ZXJEZWZhdWx0cy5pc0NsaWVudEdlbmVyYXRlQWxsKCkpOwotCQkvL0FBUiBEZWZhdWx0cwotCQlzZXREZWZhdWx0KFBSRUZFUkVOQ0VfQUFSX0VYVEVOVElPTiwgQXhpczJFbWl0dGVyRGVmYXVsdHMuZ2V0QWFyRXh0ZW50aW9uKCkpOwotCi0JfQotCQotCXByaXZhdGUgUGVyc2lzdGVudEF4aXMyRW1pdHRlckNvbnRleHQoKSAJewotCQlzdXBlcihXZWJTZXJ2aWNlQXhpczJDb3JlUGx1Z2luLmdldEluc3RhbmNlKCkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXhpczJSdW50aW1lTG9jYXRpb24oKSB7Ci0JCXJldHVybiBnZXRWYWx1ZUFzU3RyaW5nKFBSRUZFUkVOQ0VfQVhJUzJfUlVOVElNRV9MT0NBVElPTik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXhpczJSdW50aW1lTG9jYXRpb24oU3RyaW5nIHJ1bnRpbWVMb2NhdGlvbikgewotCQlzZXRWYWx1ZShQUkVGRVJFTkNFX0FYSVMyX1JVTlRJTUVfTE9DQVRJT04sIHJ1bnRpbWVMb2NhdGlvbik7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzQXhpczJTZXJ2ZXJQYXRoUmVwcmVzZW50c1dhcigpIHsKLQkJcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfQVhJUzJfU0VSVkVSX0lTX1dBUik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXhpczJTZXJ2ZXJQYXRoUmVwcmVzZW50c1dhcihTdHJpbmcgaXNXYXIpIHsKLQkJc2V0VmFsdWUoUFJFRkVSRU5DRV9BWElTMl9TRVJWRVJfSVNfV0FSLCBpc1dhcik7Ci0JfQotCQotCS8vU2VydmljZSAKLQkKLQlwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VEYXRhYmluZGluZygpIHsKLQkJcmV0dXJuIGdldFZhbHVlQXNTdHJpbmcoUFJFRkVSRU5DRV9TRVJWSUNFX0RBVEFCSU5ESU5HKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U2VydmljZURhdGFiaW5kaW5nKFN0cmluZyBzZXJ2aWNlRGF0YWJpbmRpbmcpIHsKLQkJc2V0VmFsdWUoUFJFRkVSRU5DRV9TRVJWSUNFX0RBVEFCSU5ESU5HLCBzZXJ2aWNlRGF0YWJpbmRpbmcpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1NlcnZpY2VJbnRlcmZhY2VTa2VsZXRvbigpIHsKLQkJcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfU0VSVklDRV9JTlRFUkZBQ0VfU0tFTEVUT04pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlSW50ZXJmYWNlU2tlbGV0b24oYm9vbGVhbiBzZXJ2aWNlSW50ZXJmYWNlU2tlbGV0b24pIHsKLQkJc2V0VmFsdWUoUFJFRkVSRU5DRV9TRVJWSUNFX0lOVEVSRkFDRV9TS0VMRVRPTiwgc2VydmljZUludGVyZmFjZVNrZWxldG9uKTsJCi0JfQkKLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1NlcnZpY2VHZW5lcmF0ZUFsbCgpIHsKLQkJcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfU0VSVklDRV9HRU5FUkFURV9BTEwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlR2VuZXJhdGVBbGwoYm9vbGVhbiBzZXJ2aWNlR2VuZXJhdGVBbGwpIHsKLQkJc2V0VmFsdWUoUFJFRkVSRU5DRV9TRVJWSUNFX0dFTkVSQVRFX0FMTCwgc2VydmljZUdlbmVyYXRlQWxsKTsKLQl9Ci0JCi0JCi0JLy9DbGllbnQKLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1N5bmMoKSB7Ci0JCXJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihQUkVGRVJFTkNFX0NMSUVOVF9TWU5DKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3luYyhib29sZWFuIGNsaWVudFN5bmMpIHsKLQkJc2V0VmFsdWUoUFJFRkVSRU5DRV9DTElFTlRfU1lOQywgY2xpZW50U3luYyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNBc3luYygpIHsKLQkJcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfQ0xJRU5UX0FTWU5DKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0QXN5bmMoYm9vbGVhbiBjbGllbnRBc3luYykgewotCQlzZXRWYWx1ZShQUkVGRVJFTkNFX0NMSUVOVF9BU1lOQywgY2xpZW50QXN5bmMpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldENsaWVudERhdGFiaW5kaW5nKCkgewotCQlyZXR1cm4gZ2V0VmFsdWVBc1N0cmluZyhQUkVGRVJFTkNFX0NMSUVOVF9EQVRBQklORElORyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldENsaWVudERhdGFiaW5kaW5nKFN0cmluZyBjbGllbnREYXRhYmluZGluZykgewotCQlzZXRWYWx1ZShQUkVGRVJFTkNFX0NMSUVOVF9EQVRBQklORElORywgY2xpZW50RGF0YWJpbmRpbmcpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0NsaWVudFRlc3RDYXNlKCkgewotCQlyZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oUFJFRkVSRU5DRV9DTElFTlRfVEVTVENBU0UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRDbGllbnRUZXN0Q2FzZShib29sZWFuIGNsaWVudFRlc3RDYXNlKSB7Ci0JCXNldFZhbHVlKFBSRUZFUkVOQ0VfQ0xJRU5UX1RFU1RDQVNFLCBjbGllbnRUZXN0Q2FzZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDbGllbnRHZW5lcmF0ZUFsbCgpIHsKLQkJcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfQ0xJRU5UX0dFTkVSQVRFX0FMTCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2xpZW50R2VuZXJhdGVBbGwoYm9vbGVhbiBjbGllbnRHZW5yYXRlQWxsKSB7Ci0JCXNldFZhbHVlKFBSRUZFUkVOQ0VfQ0xJRU5UX0dFTkVSQVRFX0FMTCwgY2xpZW50R2VucmF0ZUFsbCk7Ci0JfQotCi0JCi0JLy9BQVIgT3B0aW9ucwotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QWFyRXh0ZW50aW9uKCl7Ci0JCXJldHVybiBnZXRWYWx1ZUFzU3RyaW5nKFBSRUZFUkVOQ0VfQUFSX0VYVEVOVElPTik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEFhckV4dGVudGlvbihTdHJpbmcgYWFyRXh0ZW50aW9uKXsKLQkJc2V0VmFsdWUoUFJFRkVSRU5DRV9BQVJfRVhURU5USU9OLCBhYXJFeHRlbnRpb24pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NvcmUvY29udGV4dC9TZXJ2aWNlQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NvcmUvY29udGV4dC9TZXJ2aWNlQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmI0MWE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb3JlL2NvbnRleHQvU2VydmljZUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogV1NPMiBJbmMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzAxMzAgICAxNjg3NjIgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgSW5pdGlhbCBjb2RlIHRvIGludHJvZHVzZSAKLSAqIAkJCQkJCQkJCQkJdGhlIEF4aXMyIHJ1bnRpbWUgdG8gdGhlIGZyYW1ld29yayBmb3IgMTY4NzYyCi0gKiAyMDA3MDUwMiAgIDE4NDMwMiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBGaXggY29weXJpZ2h0IGZvciBBeGlzMiBwbHVnaW5zCi0gKiAyMDA3MDUwOCAgIDE3NTAzMCBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBSZWZhY3RvciBCdVNlcnZpY2VDb250ZXh0IAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLmNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlQ29udGV4dCB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU2VydmljZUNvbnRleHQgaW5zdGFuY2U7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHNlcnZpY2VOYW1lOyAKLQkKLQkvL3NpbmdsZXRvbgotCXByaXZhdGUgU2VydmljZUNvbnRleHQoKXt9Ci0JCi0JcHVibGljIHN0YXRpYyBTZXJ2aWNlQ29udGV4dCBnZXRJbnN0YW5jZSgpewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJaW5zdGFuY2UgPSBuZXcgU2VydmljZUNvbnRleHQoKTsKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlTmFtZSgpIHsKLQkJcmV0dXJuIHNlcnZpY2VOYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VOYW1lKFN0cmluZyBzZXJ2aWNlTmFtZSkgewotCQlTZXJ2aWNlQ29udGV4dC5zZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lOwotCX0KLQkKLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb3JlL3BsdWdpbi9XZWJTZXJ2aWNlQXhpczJDb3JlUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29yZS9wbHVnaW4vV2ViU2VydmljZUF4aXMyQ29yZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjNhZGVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb3JlL3BsdWdpbi9XZWJTZXJ2aWNlQXhpczJDb3JlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IFdTTzIgSW5jLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBXU08yIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzAxMzAgICAxNjg3NjIgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgSW5pdGlhbCBjb2RlIHRvIGludHJvZHVzZSB0aGUgQXhpczIgCi0gKiAJCQkJCQkJCQkJICBydW50aW1lIHRvIHRoZSBmcmFtZXdvcmsgZm9yIDE2ODc2MgotICogMjAwNzA0MjYgICAxODMwNDYgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aAotICogMjAwNzA1MTYgICAxODMxNDcgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCBGaXggZm9yIHRoZSBwZXJzaXN0aW5nIERCQ1MgcGF0aHMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5wbHVnaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLmNvbnRleHQuQXhpczJFbWl0dGVyQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBeGlzMkVtaXR0ZXJDb250ZXh0OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZUF4aXMyQ29yZVBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZSI7Ci0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0JcHJpdmF0ZSBzdGF0aWMgV2ViU2VydmljZUF4aXMyQ29yZVBsdWdpbiBpbnN0YW5jZV87Ci0JCi0KLQlwcml2YXRlIFBlcnNpc3RlbnRBeGlzMkVtaXR0ZXJDb250ZXh0IGF4aXMyRW1pdHRlckNvbnRleHRfOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBXZWJTZXJ2aWNlQXhpczJDb3JlUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlpZiAoaW5zdGFuY2VfID09IG51bGwpIHsKLQkJCWluc3RhbmNlXyA9IHRoaXM7Ci0JCX0KLQl9Ci0KLQkKLQlwdWJsaWMgQXhpczJFbWl0dGVyQ29udGV4dCBnZXRBeGlzRW1pdHRlckNvbnRleHQoKXsKLQkJaWYgKGF4aXMyRW1pdHRlckNvbnRleHRfID09IG51bGwpIAotCSAgCQlheGlzMkVtaXR0ZXJDb250ZXh0XyA9IFBlcnNpc3RlbnRBeGlzMkVtaXR0ZXJDb250ZXh0LmdldEluc3RhbmNlKCk7Ci0JCXJldHVybiBheGlzMkVtaXR0ZXJDb250ZXh0XzsKLQl9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2lucyNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWluc3RhbmNlXyA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdlYlNlcnZpY2VBeGlzMkNvcmVQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIGluc3RhbmNlXzsKLQl9Ci0JCi0JIC8vIFRoaXMgbWV0aG9kIGlzIG5lZWRlZCB0byBrZWVwIHRoZSBsb2dnaW5nIGZyb20gYmxvd2luZyB1cC4KLQkgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCSAgewotCSAgICByZXR1cm4gUExVR0lOX0lEOyAgCi0JICB9Ci0JICAKLQkJLyoqCi0JCSogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgcGx1Z2luLiBFcXVpdmFsZW50IHRvIGNhbGxpbmcKLQkJKiAoV2ViU2VydmljZVdhc0NvbnN1bXB0aW9uUGx1Z2luKVBsYXRmb3JtLmdldFBsdWdpbigib3JnLmVjbGlwc2UuanN0LndzLndhcy52NS50cCIpOwotCQkqIEByZXR1cm4gVGhlIFdlYlNlcnZpY2VBeGlzQ29uc3VtcHRpb25Db3JlUGx1Z2luIHNpbmdsZXRvbi4KLQkJKi8KLQkJc3RhdGljIHB1YmxpYyBXZWJTZXJ2aWNlQXhpczJDb3JlUGx1Z2luIGdldEluc3RhbmNlKCkgewotCQkJcmV0dXJuIGluc3RhbmNlXzsKLQkJfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29yZS9wbHVnaW4vbWVzc2FnZXMvQXhpczJDb3JlVUkucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb3JlL3BsdWdpbi9tZXNzYWdlcy9BeGlzMkNvcmVVSS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2ZhZDFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb3JlL3BsdWdpbi9tZXNzYWdlcy9BeGlzMkNvcmVVSS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgV1NPMiBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0jIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIDIwMDcwMTEwICAgMTY4NzYyIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgY29kZSB0byBpbnRyb2R1c2UgdGhlIEF4aXMyIAotIwkJCQkJCQkJCQkgcnVudGltZSB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjIKLSMgMjAwNzA0MjYgICAxODMwNDYgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aAotIyAyMDA3MDUwMSAgIDE4MDI4NCBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoCi0jIDIwMDcwNTA4ICAgMTg0NDUwIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGggZml4IDE4NDQ1MCwgbW9yZSBpbmZvcm1hdGlvbiBmb3IgdXNlcgotIyAyMDA3MDUxMSAgIDE4NjQ0MCBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoIGZpeCAxODY0NDAKLSMgMjAwNzA1MTAgICAxNzI5MjYgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgRml4IDE3MjkyNiBVc2UgVXRpbCBDbGFzc2VzCi0jIDIwMDcwNTE3ICAgMTg3MzA3IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEZpeCAxODczMDcgUHJvcGVydHkgRmlsZSBGaXgKLSMgMjAwNzA2MDQgICAxOTAwNjcgcG1vb2drQGNhLmlibS5jb20gLSBQZXRlciBNb29nawotIyAyMDA4MDEzMCAgIDIxNjk5NyBrYXRlcEB3c28yLmNvbSAtIEthdGUgUHJpY2UKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotTEFCRUxfQlJPVVNFPUJyb3dzZS4uLgotTEFCRUxfV0VCX1NFUlZJQ0VfQ09ERUdFTj1XZWIgc2VydmljZSBjb2RlIGdlbmVyYXRpb24gb3B0aW9ucwotTEFCRUxfV0VCX1NFUlZJQ0VfQ0xJRU5UX0NPREVHRU49V2ViIHNlcnZpY2UgY2xpZW50IGNvZGUgZ2VuZXJhdGlvbiBvcHRpb25zCi1MQUJFTF9XRUJfU0VSVklDRV9BQVI9V2ViIHNlcnZpY2UgYXJjaGl2ZSBvcHRpb25zCi1MQUJFTF9EQVRBQklORElORz1EZWZhdWx0IERhdGFiaW5kaW5nOgotTEFCRUxfQUFSX0VYVEVOVElPTj1BQVIgZGVmYXVsdCBleHRlbnNpb246Ci1MQUJFTF9BWElTMl9SVU5USU1FX0xPQUQ9QXhpczIgcnVudGltZSBsb2FkZWQgc3VjY2Vzc2Z1bGx5Ci1MQUJFTF9BWElTMl9SVU5USU1FX0xPQURfRVJST1I9RXJyb3Igb2NjdXJyZWQgd2hpbGUgbG9hZGluZyBBeGlzMiBydW50aW1lLiBTZWxlY3QgdGhlIGNvcnJlY3QgQXhpczIgcnVudGltZSBmb2xkZXIuCi1MQUJFTF9HRU5FUkFURV9URVNUQ0FTRV9DQVBUSU9OPUdlbmVyYXRlIGEgSlVuaXQgdGVzdCBjYXNlIHRvIHRlc3QgdGhlIHNlcnZpY2UKLUxBQkVMX0dFTkVSQVRFX1NFUlZFUlNJREVfSU5URVJGQUNFPUdlbmVyYXRlIGFuIGludGVyZmFjZSBmb3IgdGhlIHNrZWxldG9uCi1MQUJFTF9HRU5FUkFURV9BTEw9R2VuZXJhdGUgYWxsIHR5cGVzIGZvciBhbGwgZWxlbWVudHMgcmVmZXJyZWQgdG8gYnkgc2NoZW1hcwotTEFCRUxfQ0xJRU5UX1NJREU9Q2xpZW50IG1vZGUKLUxBQkVMX1NZTkNfQU5EX0FTWU5DPUdlbmVyYXRlIGEgY2xpZW50IHdoaWNoIHN1cHBvcnRzIGJvdGggc3luY2hyb25vdXMgYW5kIGFzeW5jaHJvbm91cyBpbnZvY2F0aW9uCi1MQUJFTF9TWU5DPUdlbmVyYXRlIGEgc3luY2hyb25vdXMgY2xpZW50Ci1MQUJFTF9BU1lOQz1HZW5lcmF0ZSBhbiBhc3luY2hyb25vdXMgY2xpZW50Ci0KLUFYSVMyX0xPQ0FUSU9OPUF4aXMyIFJ1bnRpbWUKLUFYSVMyX1JVTlRJTUU9QXhpczIgUnVudGltZQotQVhJUzJfUFJFRkVSRU5DRVM9QXhpczIgUHJlZmVyZW5jZXMKLUFYSVMyX1JVTlRJTUVfVE9PTFRJUD1TZWxlY3QgdGhlIEF4aXMyIGJpbmFyeSBkaXN0cmlidXRpb24gZm9sZGVyIG9yIHRoZSBmb2xkZXIgd2hpY2ggY29udGFpbnMgdGhlIEF4aXMyIHdhciBkaXN0cmlidXRpb24KLUFYSVMyX1BSRUZFUkVOQ0VTX1RPT0xUSVA9U2VsZWN0IHRoZSBkZWZhdWx0IHByZWZlcmVuY2VzIGZvciBBeGlzMiBydW50aW1lCi1BWElTMl9SVU5USU1FX0xPQ0FUSU9OPUF4aXMyIHJ1bnRpbWUgbG9jYXRpb246Ci1BWElTMl9SVU5USU1FX1BSRUZFUkVOQ0VTPUF4aXMyIFJ1bnRpbWUgUHJlZmVyZW5jZXMKLUxBQkVMX0FYSVMyX1JVTlRJTUVfTk9UX0VYSVQ9U2VsZWN0IHRoZSBsb2NhdGlvbiBvZiB0aGUgQXhpczIgYmluYXJ5IGRpc3RyaWJ1dGlvbiBvciB0aGUgZm9sZGVyIHdoaWNoIGNvbnRhaW5zIHRoZSBBeGlzMiB3YXIgZGlzdHJpYnV0aW9uLiAKLUVSUk9SX0lOVkFMSURfQVhJUzJfU0VSVkVSX0xPQ0FUSU9OPUludmFsaWQgQXhpczIgcnVudGltZSBsb2NhdGlvbgotCi1FUlJPUl9JTlZBTElEX0ZJTEVfUkVBRF9XUklURUw9RXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIHJlYWRpbmcgb3Igd3JpdGluZyBmaWxlIHswfQotRVJST1JfU0VSVkVSX0lTX05PVF9TRVQ9VGhlIEF4aXMyIGZhY2V0cyBjYW5ub3QgYmUgaW5zdGFsbGVkIHNpbmNlIHRoZSBBeGlzMiBydW50aW1lIGxvY2F0aW9uIGhhcyBub3QgYmVlbiBzZXQuICBcbkdvIHRvIHRoZSBXZWIgU2VydmljZXMgcHJlZmVyZW5jZSBwYWdlIGFuZCBzZXQgdGhlIEF4aXMyIHJ1bnRpbWUgbG9jYXRpb24gdW5kZXIgQXhpczIgUHJlZmVyZW5jZXMuCi0KLVBST0dSRVNTX0lOU1RBTExfQVhJUzJfUlVOVElNRT1JbnN0YWxsaW5nIEF4aXMyIFJ1bnRpbWUKLVBST0dSRVNTX1VOSU5TVEFMTF9BWElTMl9SVU5USU1FPVVuaW5zdGFsbGluZyB0aGUgQXhpczIgUnVudGltZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NvcmUvcGx1Z2luL21lc3NhZ2VzL0F4aXMyQ29yZVVJTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb3JlL3BsdWdpbi9tZXNzYWdlcy9BeGlzMkNvcmVVSU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MWM1ZTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NvcmUvcGx1Z2luL21lc3NhZ2VzL0F4aXMyQ29yZVVJTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDExMCAgIDE2ODc2MiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbml0aWFsIGNvZGUgdG8gaW50cm9kdXNlIAotICogCQkJCQkJCQkJCXRoZSBBeGlzMiBydW50aW1lIHRvIHRoZSBmcmFtZXdvcmsgZm9yIDE2ODc2MgotICogMjAwNzA0MjYgICAxODMwNDYgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aAotICogMjAwNzA1MDEgICAxODAyODQgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aAotICogMjAwNzA1MTEgICAxODY0NDAgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCBmaXggMTg2NDQwCi0gKiAyMDA3MDUxMCAgIDE3MjkyNiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBGaXggMTcyOTI2IFVzZSBVdGlsIENsYXNzZXMKLSAqIDIwMDcwNTE3ICAgMTg3MzA3IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEZpeCAxODczMDcgUHJvcGVydHkgRmlsZSBGaXgKLSAqIDIwMDcwNTE4ICAgICAgICAxODczMTEgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgRml4aW5nIHRlc3QgcmVzb3VyY2UgYWRkaXRpb24KLSAqIDIwMDcwODA4ICAgMTk0OTA2IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEZpeGluZyAxOTQ5MDYgUnVudGltZSBsaWIgaXNzdWUKLSAqIDIwMDcwODI0ICAgMjAwNTE1IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIE5PTi1OTFMgbW92ZSB0byBzZXBlcmF0ZSBmaWxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUucGx1Z2luLm1lc3NhZ2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGZpbmFsIGNsYXNzIEF4aXMyQ29yZVVJTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gCi0JCQkib3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUucGx1Z2luLm1lc3NhZ2VzLkF4aXMyQ29yZVVJIjsJCS8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQXhpczJDb3JlVUlNZXNzYWdlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfQlJPVVNFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX1dFQl9TRVJWSUNFX0NPREVHRU47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfV0VCX1NFUlZJQ0VfQ0xJRU5UX0NPREVHRU47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfV0VCX1NFUlZJQ0VfQUFSOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX0FBUl9FWFRFTlRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfREFUQUJJTkRJTkc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfQVhJUzJfUlVOVElNRV9MT0FEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX0FYSVMyX1JVTlRJTUVfTE9BRF9FUlJPUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9BWElTMl9SVU5USU1FX05PVF9FWElUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX0dFTkVSQVRFX1RFU1RDQVNFX0NBUFRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfR0VORVJBVEVfU0VSVkVSU0lERV9JTlRFUkZBQ0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfR0VORVJBVEVfQUxMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX0NMSUVOVF9TSURFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX1NZTkNfQU5EX0FTWU5DOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX1NZTkM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfQVNZTkM7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQVhJUzJfTE9DQVRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQVhJUzJfUlVOVElNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBWElTMl9QUkVGRVJFTkNFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBWElTMl9SVU5USU1FX1RPT0xUSVA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQVhJUzJfUFJFRkVSRU5DRVNfVE9PTFRJUDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBWElTMl9SVU5USU1FX0xPQ0FUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFYSVMyX1JVTlRJTUVfUFJFRkVSRU5DRVM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJPUl9JTlZBTElEX0FYSVMyX1NFUlZFUl9MT0NBVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJPUl9JTlZBTElEX0ZJTEVfUkVBRF9XUklURUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJST1JfU0VSVkVSX0lTX05PVF9TRVQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQUk9HUkVTU19JTlNUQUxMX0FYSVMyX1JVTlRJTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUFJPR1JFU1NfVU5JTlNUQUxMX0FYSVMyX1JVTlRJTUU7Ci0JCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQXhpczJDb3JlVUlNZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NvcmUvdXRpbHMvQXhpczJDb3JlVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb3JlL3V0aWxzL0F4aXMyQ29yZVV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNDM0MzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NvcmUvdXRpbHMvQXhpczJDb3JlVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDEzMCAgIDE2ODc2MiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbml0aWFsIGNvZGUgdG8gaW50cm9kdXNlIHRoZSBBeGlzMiAKLSAqIAkJCQkJCQkJCQkgIHJ1bnRpbWUgdG8gdGhlIGZyYW1ld29yayBmb3IgMTY4NzYyCi0gKiAyMDA3MDQyNiAgIDE4MzA0NiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoCi0gKiAyMDA3MDUwMSAgIDE4MDI4NCBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoCi0gKiAyMDA3MDgyNCAgIDIwMDUxNSBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBOT04tTkxTIG1vdmUgdG8gc2VwZXJhdGUgZmlsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLnV0aWxzOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUuY29uc3RhbnQuQXhpczJDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBBeGlzMkNvcmVVdGlscyB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBhbHJlYWR5Q29tcHV0ZWRUZW1wQXhpczJEaXJlY3RvcnkgPSBmYWxzZTsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgdGVtcEF4aXMyRGlyID0gbnVsbDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0ZW1wQXhpczJEaXJlY3RvcnkoKSB7Ci0JCWlmICghYWxyZWFkeUNvbXB1dGVkVGVtcEF4aXMyRGlyZWN0b3J5KXsKLQkJCVN0cmluZ1tdIG5vZGVzID0ge0F4aXMyQ29uc3RhbnRzLkRJUl9ET1RfTUVUQURBVEEsCi0JCQkJCUF4aXMyQ29uc3RhbnRzLkRJUl9ET1RfUExVR0lOUywKLQkJCQkJQXhpczJDb25zdGFudHMuVEVNUF9BWElTMl9GQUNFVF9ESVJ9OwotCQkJdGVtcEF4aXMyRGlyID1GaWxlVXRpbHMuYWRkTm9kZXNUb1BhdGgoCi0JCQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCksIG5vZGVzKTsgCi0JCQlhbHJlYWR5Q29tcHV0ZWRUZW1wQXhpczJEaXJlY3Rvcnk9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIHRlbXBBeGlzMkRpcjsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGVtcEF4aXMyV2ViYXBwRmlsZUxvY2F0aW9uKCkgewotCQlyZXR1cm4KLQkJYWRkQW5vdGhlck5vZGVUb1BhdGgodGVtcEF4aXMyRGlyZWN0b3J5KCksCi0JCQkJQXhpczJDb25zdGFudHMuV0VCQVBQX0VYUExPREVEX1NFUlZFUl9MT0NBVElPTl9GSUxFKTsKLQl9Ci0JCi0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGVtcFJ1bnRpbWVTdGF0dXNGaWxlTG9jYXRpb24oKSB7Ci0JCXJldHVybgotCQlhZGRBbm90aGVyTm9kZVRvUGF0aCh0ZW1wQXhpczJEaXJlY3RvcnkoKSwKLQkJCQlBeGlzMkNvbnN0YW50cy5TRVJWRVJfU1RBVFVTX0xPQ0FUSU9OX0ZJTEUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0ZW1wV2FyU3RhdHVzRmlsZUxvY2F0aW9uKCkgewotCQlyZXR1cm4KLQkJYWRkQW5vdGhlck5vZGVUb1BhdGgodGVtcEF4aXMyRGlyZWN0b3J5KCksCi0JCQkJQXhpczJDb25zdGFudHMuV0FSX1NUQVRVU19MT0NBVElPTl9GSUxFKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkQW5vdGhlck5vZGVUb1BhdGgoU3RyaW5nIGN1cnJlbnRQYXRoLCBTdHJpbmcgbmV3Tm9kZSkgewotCQlyZXR1cm4gY3VycmVudFBhdGggKyBGaWxlLnNlcGFyYXRvciArIG5ld05vZGU7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCAgd3JpdGVQcm9wZXJ0eVRvRmlsZShGaWxlIGZpbGUsU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlXcml0ZXIgb3V0ID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoCi0JCQkJCQluZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKSwgIjg4NTlfMSIpKTsKLQkgICAgICAgb3V0LndyaXRlKGtleSsiPSIrdmFsdWUrIlxuIik7Ci0JICAgICAgIG91dC5jbG9zZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NvcmUvdXRpbHMvQ2xhc3NMb2FkaW5nVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NvcmUvdXRpbHMvQ2xhc3NMb2FkaW5nVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmQ2ZTM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb3JlL3V0aWxzL0NsYXNzTG9hZGluZ1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IFdTTzIgSW5jLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBXU08yIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzAxMzAgICAxNjg3NjIgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgSW5pdGlhbCBjb2RlIHRvIGludHJvZHVzZSB0aGUgQXhpczIgCi0gKiAJCQkJCQkJCQkJICBydW50aW1lIHRvIHRoZSBmcmFtZXdvcmsgZm9yIDE2ODc2MgotICogMjAwNzA0MjYgICAxODMwNDYgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aAotICogMjAwNzA5MTkgICAyMDIyOTkgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCBGaXggZm9yIEFJT0IgRXhwCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUudXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkFudENsYXNzTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKLQotcHVibGljIGNsYXNzIENsYXNzTG9hZGluZ1V0aWwgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gYXhpczJDbGFzc1BhdGggPSBudWxsOwotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGNsYXNzTG9hZFBhdGggPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGludCBsaWJDb3VudCA9IDA7Ci0JcHJpdmF0ZSBzdGF0aWMgQW50Q2xhc3NMb2FkZXIgYW50Q2xhc3NMb2FkZXI7Ci0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBsaWJzTG9hZGVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBzdGF0aWMgVVJMW10gdXJscyA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBhbHJlYWR5SW5pdCA9IGZhbHNlOwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaW5pdEJ5Q2xpZW50ID0gZmFsc2U7Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGluaXQoU3RyaW5nIHByb2plY3QpIHsKLQkJaWYgKCFhbHJlYWR5SW5pdCkgewotCi0JCS8vT2J0YWluIGEgYW50IGNsYXNzIGxvYWRlciBpbnN0YW5jZQotCQkJaWYoYW50Q2xhc3NMb2FkZXI9PW51bGwpewotCQlhbnRDbGFzc0xvYWRlciA9ICBuZXcgQW50Q2xhc3NMb2FkZXIoKTsKLQkJCX0KLQkJCi0JCS8vIFNldCB0aGUgY2xhc3MgbG9hZGVyIHRvIGNoaWxkIGZpcnN0Ci0JCWFudENsYXNzTG9hZGVyLnNldFBhcmVudEZpcnN0KGZhbHNlKTsKLQkJCi0JCQlpZiAoKGNsYXNzTG9hZFBhdGggPT1udWxsKSB8fCAhbGlic0xvYWRlZCl7Ci0JCQkJY2xhc3NMb2FkUGF0aCA9IGdldEF4aXMyTGlicyhwcm9qZWN0KTsKLQkJCX0KLQkJCQotCQkJaWYodXJscyA9PSBudWxsKXsKLQkJCQl1cmxzPSBuZXcgVVJMW2NsYXNzTG9hZFBhdGgubGVuZ3RoXTsKLQkJCX1lbHNlIGlmKHVybHMgIT0gbnVsbCAmJiAodXJscy5sZW5ndGgpIT0oY2xhc3NMb2FkUGF0aC5sZW5ndGgpKXsKLQkJCQl1cmxzPSBuZXcgVVJMW2NsYXNzTG9hZFBhdGgubGVuZ3RoXTsKLQkJCX0KLQotCQlQYXRoIGNsYXNzcGF0aCA9IG5ldyBQYXRoKG5ldyBQcm9qZWN0KCkpOwotCQkKLQkJdHJ5ewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc0xvYWRQYXRoLmxlbmd0aDsgaSsrKSB7Ci0JCQkJLy9DcmVhdGUgYSBGaWxlIG9iamVjdCBvbiB0aGUgcm9vdCBvZiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGNsYXNzIGZpbGUKLQkJCQlpZihjbGFzc0xvYWRQYXRoW2ldIT1udWxsKXsKLQkJCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoY2xhc3NMb2FkUGF0aFtpXSk7Ci0JCQkJCS8vIENvbnZlcnQgRmlsZSB0byBhIFVSTAotCQkJCQlVUkwgdXJsID0gZmlsZS50b1VSTCgpOyAgICAgICAgICAKLQkJCQkJdXJsc1tpXT0gdXJsOwotCQkJCQljbGFzc3BhdGguc2V0UGF0aChjbGFzc0xvYWRQYXRoW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJfWNhdGNoKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKXsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJCWFudENsYXNzTG9hZGVyLnNldENsYXNzUGF0aChjbGFzc3BhdGgpOwotCQkJYWxyZWFkeUluaXQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQotCQotCQotCXB1YmxpYyBzdGF0aWMgQ2xhc3MgbG9hZENsYXNzRnJvbUFudENsYXNzTG9hZGVyKFN0cmluZyBmaWxseVF1YWxpZmllZENsYXNzTmFtZSl7Ci0JCQotCQlDbGFzcyBjbHMgPSBudWxsOwotCQl0cnl7CQotCQkJY2xzID0gYW50Q2xhc3NMb2FkZXIubG9hZENsYXNzKGZpbGx5UXVhbGlmaWVkQ2xhc3NOYW1lKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBjbHM7Ci0JfQotCQotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGdldEF4aXMyTGlicyhTdHJpbmcgcHJvamVjdCl7Ci0JCUZpbGUgd2ViQ29udGFpbmVyUGF0aCA9IG5ldyBGaWxlKEZhY2V0Q29udGFpbmVyVXRpbHMucGF0aFRvV2ViUHJvamVjdENvbnRhaW5lckxpYihwcm9qZWN0KSk7Ci0JCWF4aXMyQ2xhc3NQYXRoID0gbmV3IFN0cmluZ1t3ZWJDb250YWluZXJQYXRoLmxpc3QoKS5sZW5ndGhdOwotCQlsaWJDb3VudCA9IDA7Ci0JCXZpc2l0QWxsRmlsZXMod2ViQ29udGFpbmVyUGF0aCk7Ci0JCXJldHVybiBheGlzMkNsYXNzUGF0aDsKLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB2aXNpdEFsbEZpbGVzKEZpbGUgZGlyKSB7Ci0JCWlmKCFkaXIudG9TdHJpbmcoKS5lbmRzV2l0aCgiLnR4dCIpKXsKLQkJCWlmIChkaXIuaXNEaXJlY3RvcnkoKSkgewotCi0JCQkJU3RyaW5nW10gY2hpbGRyZW4gPSBkaXIubGlzdCgpOwotCQkJCWZvciAoaW50IGk9MDsgaTxjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCQl2aXNpdEFsbEZpbGVzKG5ldyBGaWxlKGRpciwgY2hpbGRyZW5baV0pKTsKLQkJCQl9Ci0KLQkJCX0gZWxzZSB7Ci0JCQkJYXhpczJDbGFzc1BhdGhbbGliQ291bnRdPWRpci5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCQlsaWJDb3VudCs9MTsKLQkJCX0KLQotCQl9Ci0JCWxpYnNMb2FkZWQgPSB0cnVlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhbkFudENsYXNzTG9hZGVyKCl7Ci0JCWlmKGluaXRCeUNsaWVudCl7Ci0JCQlhbnRDbGFzc0xvYWRlci5jbGVhbnVwKCk7Ci0JCQlhbHJlYWR5SW5pdCA9IGZhbHNlOwotCQl9Ci19Ci0JcHVibGljIHN0YXRpYyB2b2lkIHNldEluaXRCeUNsaWVudChib29sZWFuIHN0YXR1cyl7Ci0JCWluaXRCeUNsaWVudCA9IHN0YXR1czsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29yZS91dGlscy9GYWNldENvbnRhaW5lclV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29yZS91dGlscy9GYWNldENvbnRhaW5lclV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMzNiN2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NvcmUvdXRpbHMvRmFjZXRDb250YWluZXJVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDIyMiAgMTY4NzY2IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgY29kZSB0byBpbnRyb2R1c2UgdGhlIEF4aXMyIAotICogCQkJCQkJCQkJCSAgZmFjZXQgdG8gdGhlIGZyYW1ld29yayBmb3IgMTY4NzY2Ci0gKiAyMDA3MDQyNiAgIDE4MzA0NiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoCi0gKiAyMDA3MDUxMCAgIDE3MjkyNiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBGaXggMTcyOTI2IFVzZSBVdGlsIENsYXNzZXMKLSAqIDIwMDcwNjA2ICAgMTc3NDIxIHNhbmRha2l0aEB3c28yLmNvbSAtIGZpeCB3ZWIueG1sIHdpcGVkIG91dCB3aGVuIEF4aXMyIGZhY2V0Ci0gKiAyMDA3MDYxMiAgIDE5MjA0NyBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCAxOTIwNDcKLSAqIDIwMDcwNjEyICAgMTkyMDQ3IGthdGh5QGNhLmlibS5jb20gICAtIEthdGh5IENoYW4KLSAqIDIwMDcwODEzICAgMTk2MTczICBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBGaXggMTk2MTczLCBEV1AgY3VzdG9tIGxvY2F0aW9uIGZpeAotICogMjAwNzA4MjQgICAyMDA1MTUgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgTk9OLU5MUyBtb3ZlIHRvIHNlcGVyYXRlIGZpbGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS51dGlsczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUuY29uc3RhbnQuQXhpczJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUucGx1Z2luLldlYlNlcnZpY2VBeGlzMkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5KMkVFVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TZXJ2ZXJVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLQotcHVibGljIGNsYXNzIEZhY2V0Q29udGFpbmVyVXRpbHMgewotCQotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0V29ya3NwYWNlKCl7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldExvY2F0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgZ2V0UHJvamVjdE5hbWUoU3RyaW5nIHByb2plY3QpewotCQlTdHJpbmcgcHJvamVjdFN0cmluZyA9IHJlcGxhY2VFc2NhcGVjaGFyYWN0b3JzKHByb2plY3QudG9TdHJpbmcoKSk7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoCi0JCQkJZ2V0UHJvamVjdE5hbWVGcm9tRnJhbWV3b2tOYW1lU3RyaW5nKHByb2plY3RTdHJpbmcpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRQcm9qZWN0Um9vdChTdHJpbmcgcHJvamVjdCl7Ci0JCVN0cmluZyBwcm9qZWN0U3RyaW5nID0gcmVwbGFjZUVzY2FwZWNoYXJhY3RvcnMocHJvamVjdC50b1N0cmluZygpKTsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdCgKLQkJCQlnZXRQcm9qZWN0TmFtZUZyb21GcmFtZXdva05hbWVTdHJpbmcocHJvamVjdFN0cmluZykpLmdldExvY2F0aW9uKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgIHBhdGhUb1dlYlByb2plY3RDb250YWluZXIoU3RyaW5nIHByb2plY3QpIHsKLQkJSVBhdGggcHJvamVjdFJvb3QgPSBnZXRQcm9qZWN0Um9vdChwcm9qZWN0KTsKLQkJSVBhdGggY3VycmVudER5bmFtaWNXZWJQcm9qZWN0RGlyID0gSjJFRVV0aWxzLmdldFdlYkNvbnRlbnRQYXRoKAotCQkJCWdldFByb2plY3ROYW1lKHByb2plY3QpKTsKLQkJSVBhdGggY3VycmVudER5bmFtaWNXZWJQcm9qZWN0RGlyV2l0aG91dFByb2plY3RSb290ID0gSjJFRVV0aWxzLmdldFdlYkNvbnRlbnRQYXRoKAotCQkJCWdldFByb2plY3ROYW1lKHByb2plY3QpKS5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpLm1ha2VBYnNvbHV0ZSgpOwotCQlpZihwcm9qZWN0Um9vdC50b09TU3RyaW5nKCkuY29udGFpbnMoZ2V0V29ya3NwYWNlKCkudG9PU1N0cmluZygpKSl7Ci0JCQlyZXR1cm4gZ2V0V29ya3NwYWNlKCkKLQkJCQkJCS5hcHBlbmQoY3VycmVudER5bmFtaWNXZWJQcm9qZWN0RGlyKS50b09TU3RyaW5nKCk7Ci0JCX1lbHNlewotCQkJcmV0dXJuIHByb2plY3RSb290Ci0JCQkJCQkuYXBwZW5kKGN1cnJlbnREeW5hbWljV2ViUHJvamVjdERpcldpdGhvdXRQcm9qZWN0Um9vdCkudG9PU1N0cmluZygpOwotCQl9Ci0JCQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyAgcGF0aFRvV2ViUHJvamVjdENvbnRhaW5lcldFQklORihTdHJpbmcgcHJvamVjdCkgewotCQlJUGF0aCBwcm9qZWN0Um9vdCA9IGdldFByb2plY3RSb290KHByb2plY3QpOwotCQlJUGF0aCB3ZWJDb250YWluZXJXRUJJTkZEaXIgPSBKMkVFVXRpbHMuZ2V0V2ViSW5mUGF0aCgKLQkJCQlnZXRQcm9qZWN0TmFtZShwcm9qZWN0KSk7Ci0JCUlQYXRoIHdlYkNvbnRhaW5lcldFQklORkRpcldpdGhvdXRQcm9qZWN0Um9vdCA9IEoyRUVVdGlscy5nZXRXZWJJbmZQYXRoKAotCQkJCWdldFByb2plY3ROYW1lKHByb2plY3QpKS5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpLm1ha2VBYnNvbHV0ZSgpOwotCQlpZihwcm9qZWN0Um9vdC50b09TU3RyaW5nKCkuY29udGFpbnMoZ2V0V29ya3NwYWNlKCkudG9PU1N0cmluZygpKSl7Ci0JCQlyZXR1cm4gZ2V0V29ya3NwYWNlKCkKLQkJCQkJCS5hcHBlbmQod2ViQ29udGFpbmVyV0VCSU5GRGlyKS50b09TU3RyaW5nKCk7Ci0JCX1lbHNlewotCQkJcmV0dXJuIHByb2plY3RSb290Ci0JCQkJCQkuYXBwZW5kKHdlYkNvbnRhaW5lcldFQklORkRpcldpdGhvdXRQcm9qZWN0Um9vdCkudG9PU1N0cmluZygpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nICBwYXRoVG9XZWJQcm9qZWN0Q29udGFpbmVyTUVUQUlORihTdHJpbmcgcHJvamVjdCkgewotCQlTdHJpbmcgY29udGFpbmVyRGlyZWN0b3J5ID0gcGF0aFRvV2ViUHJvamVjdENvbnRhaW5lcihwcm9qZWN0KTsKLQkJU3RyaW5nIHdlYkNvbnRhaW5lck1FVEFJTkYgPSBBeGlzMkNvbnN0YW50cy5ESVJfTUVUQV9JTkY7Ci0JCVN0cmluZyB3ZWJDb250YWluZXJNRVRBSU5GU3RyaW5nID0gQXhpczJDb3JlVXRpbHMuYWRkQW5vdGhlck5vZGVUb1BhdGgoCi0JCQkJCQkJCQkJCQljb250YWluZXJEaXJlY3RvcnksCi0JCQkJCQkJCQkJCQl3ZWJDb250YWluZXJNRVRBSU5GKTsKLQkJcmV0dXJuIHdlYkNvbnRhaW5lck1FVEFJTkZTdHJpbmc7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nICBwYXRoVG9XZWJQcm9qZWN0Q29udGFpbmVyQXhpczJXZWIoU3RyaW5nIHByb2plY3QpIHsKLQkJU3RyaW5nIGNvbnRhaW5lckRpcmVjdG9yeSA9IHBhdGhUb1dlYlByb2plY3RDb250YWluZXIocHJvamVjdCk7Ci0JCVN0cmluZyB3ZWJDb250YWluZXJBeGlzMldlYiA9IEF4aXMyQ29uc3RhbnRzLkRJUl9BWElTMl9XRUI7Ci0JCVN0cmluZyB3ZWJDb250YWluZXJBeGlzMldlYlN0cmluZyA9IEF4aXMyQ29yZVV0aWxzLmFkZEFub3RoZXJOb2RlVG9QYXRoKAotCQkJCWNvbnRhaW5lckRpcmVjdG9yeSwKLQkJCQkJCQkJCQkJCXdlYkNvbnRhaW5lckF4aXMyV2ViKTsKLQkJcmV0dXJuIHdlYkNvbnRhaW5lckF4aXMyV2ViU3RyaW5nOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYXRoVG9XZWJQcm9qZWN0Q29udGFpbmVyTGliKFN0cmluZyBwcm9qZWN0KXsKLQkJU3RyaW5nIHdlYkNvbnRhaW5lcldFQklORlN0cmluZyA9IHBhdGhUb1dlYlByb2plY3RDb250YWluZXJXRUJJTkYocHJvamVjdCk7Ci0JCXJldHVybiAgQXhpczJDb3JlVXRpbHMuYWRkQW5vdGhlck5vZGVUb1BhdGgoCi0JCQkJd2ViQ29udGFpbmVyV0VCSU5GU3RyaW5nLAotCQkJCUF4aXMyQ29uc3RhbnRzLkRJUl9MSUIpOwotCQkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGF0aFRvV2ViUHJvamVjdENvbnRhaW5lcldlYlhNTChTdHJpbmcgcHJvamVjdCl7Ci0JCVN0cmluZyB3ZWJDb250YWluZXJXRUJJTkZTdHJpbmcgPSBwYXRoVG9XZWJQcm9qZWN0Q29udGFpbmVyV0VCSU5GKHByb2plY3QpOwotCQlyZXR1cm4gIEF4aXMyQ29yZVV0aWxzLmFkZEFub3RoZXJOb2RlVG9QYXRoKAotCQkJCXdlYkNvbnRhaW5lcldFQklORlN0cmluZywKLQkJCQkid2ViLnhtbCIpOwotCX0KLQkKLQkvL0ZpeCBmb3IgdGhlIHdpbmRvd3MgYnVpbGQgbm90IHdvcmtpbmcKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVwbGFjZUVzY2FwZWNoYXJhY3RvcnMoU3RyaW5nIHZ1bG5hcmFibGVTdHJpbmcpewotCQlpZiAodnVsbmFyYWJsZVN0cmluZy5pbmRleE9mKCIvIikhPS0xKXsKLQkJCXZ1bG5hcmFibGVTdHJpbmcgPSB2dWxuYXJhYmxlU3RyaW5nLnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvci5jaGFyQXQoMCkpOwotCQl9Ci0JCXJldHVybiB2dWxuYXJhYmxlU3RyaW5nOwotCX0KLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0UHJvamVjdE5hbWVGcm9tRnJhbWV3b2tOYW1lU3RyaW5nKFN0cmluZyBmcmFtZXdvcmtQcm9qZWN0U3RyaW5nKXsKLQkJaWYgKGZyYW1ld29ya1Byb2plY3RTdHJpbmcuaW5kZXhPZihnZXRTcGxpdENoYXJhY3RvcigpKT09IC0xKXsKLQkJCXJldHVybiBmcmFtZXdvcmtQcm9qZWN0U3RyaW5nOwotCQl9ZWxzZXsKLQkJCXJldHVybiBmcmFtZXdvcmtQcm9qZWN0U3RyaW5nLnNwbGl0KGdldFNwbGl0Q2hhcmFjdG9ycygpKVsxXTsKLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3BsaXRDaGFyYWN0b3IoKXsKLQkJLy9XaW5kb3dzIGNoZWNrIChiZWNhdXNlIGZyb20gaW5zaWRlIHd0cCBpbiByZXR1cm4gSSByZWNlaXZlZCBhIGhhcmQgY29kZWQgcGF0aCkKLQkJaWYgKEZpbGUuc2VwYXJhdG9yQ2hhciA9PSAnXFwnKXsKLQkJCXJldHVybiAiXFwiIDsKLQkJfWVsc2V7Ci0JCQlyZXR1cm4gRmlsZS5zZXBhcmF0b3I7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGF0aFRvQXhpczJDb3JlRmFjZXRUZW1wRGlyZWN0b3J5KFN0cmluZyBwcm9qZWN0KXsKLQkvLwotCQlTdHJpbmcgcGx1Z2luQXhpczJDb3JlVGVtcERpciA9IFdlYlNlcnZpY2VBeGlzMkNvcmVQbHVnaW4KLSAgICAgICAgLmdldEluc3RhbmNlKCkuZ2V0U3RhdGVMb2NhdGlvbigpLnRvT1NTdHJpbmcoKTsKLQkJU3RyaW5nIHByb2plY3RTdHJpbmcgPSByZXBsYWNlRXNjYXBlY2hhcmFjdG9ycyhwcm9qZWN0KTsKLQkJcmV0dXJuIEZpbGVVdGlscy5hZGRBbm90aGVyTm9kZVRvUGF0aChwbHVnaW5BeGlzMkNvcmVUZW1wRGlyLCBwcm9qZWN0U3RyaW5nKTsKLQkJCi0JCQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3BsaXRDaGFyYWN0b3JzKCl7Ci0JCS8vV2luZG93cyBjaGVjayAoYmVjYXVzZSBmcm9tIGluc2lkZSB3dHAgaW4gcmV0dXJuIEkgcmVjZWl2ZWQgYSBoYXJkIGNvZGVkIHBhdGgpCi0JCWlmIChGaWxlLnNlcGFyYXRvckNoYXIgPT0gJ1xcJyl7Ci0JCQlyZXR1cm4gIlxcIiArIEZpbGUuc2VwYXJhdG9yOwotCQl9ZWxzZXsKLQkJCXJldHVybiBGaWxlLnNlcGFyYXRvcjsKLQkJfQotCX0KLQkKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZXBsb3llZFdTRExVUkwoSVByb2plY3Qgc2VydmVyUHJvamVjdCwgCi0JCQkJCQkJCQkJCVN0cmluZyBTZXJ2ZXJGYWN0b3J5SWQsIAotCQkJCQkJCQkJCQlTdHJpbmcgU2VydmVySW5zdGFuY2VJZCwKLQkJCQkJCQkJCQkJU3RyaW5nIHNlcnZpY2VOYW1lKXsgCi0JCS8vIE5vdGUgdGhhdCBTZXJ2ZXJDb3JlLmZpbmRTZXJ2ZXIoKSBtaWdodCByZXR1cm4gbnVsbCBpZiB0aGUgc2VydmVyIGNhbm5vdCBiZSBmb3VuZCBhbmQKLQkJLy8gU2VydmVyVXRpbHMuZ2V0RW5jb2RlZFdlYkNvbXBvbmVudFVSTCgpIGNhbiBoYW5kbGUgbnVsbCBzZXJ2ZXIgcHJvcGVybHkgKGJ5IHVzaW5nIFNlcnZlckZhY3RvcnlJZCkKLQkJU3RyaW5nIGRlcGxveWVkV1NETFVSTHBhdGggPSBudWxsOwotCQlJU2VydmVyIHNlcnZlciA9IG51bGw7Ci0JCWlmIChTZXJ2ZXJJbnN0YW5jZUlkICE9IG51bGwpIHsKLQkJCXNlcnZlciA9IFNlcnZlckNvcmUuZmluZFNlcnZlcihTZXJ2ZXJJbnN0YW5jZUlkKTsKLQkJfQotCQlkZXBsb3llZFdTRExVUkxwYXRoID0gU2VydmVyVXRpbHMuZ2V0RW5jb2RlZFdlYkNvbXBvbmVudFVSTChzZXJ2ZXJQcm9qZWN0LCAKLQkJCQlTZXJ2ZXJGYWN0b3J5SWQsIHNlcnZlcik7Ci0JCWlmIChkZXBsb3llZFdTRExVUkxwYXRoID09IG51bGwpIHsKLQkJCWRlcGxveWVkV1NETFVSTHBhdGggPSBBeGlzMkNvbnN0YW50cy5MT0NBTF9TRVJWRVJfUE9SVDsKLQkJfQotCQlTdHJpbmdbXSBkZXBsb3llZFdTRExVUkxQYXJ0cyA9IHtBeGlzMkNvbnN0YW50cy5TRVJWSUNFUyxzZXJ2aWNlTmFtZX07Ci0JCXJldHVybiBGaWxlVXRpbHMuYWRkTm9kZXNUb1VSTChkZXBsb3llZFdTRExVUkxwYXRoLCBkZXBsb3llZFdTRExVUkxQYXJ0cykrIj93c2RsIjsKLQl9Ci0JCi0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29yZS91dGlscy9GaWxlVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb3JlL3V0aWxzL0ZpbGVVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzliMTllLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb3JlL3V0aWxzL0ZpbGVVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uLCBXU08yIEluYy4gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogV1NPMiBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIElCTSBDb3Jwb3JhdGlvbiwgV1NPMiBJbmMuIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAyMDA3MDExMCAgIDE2ODc2MiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbml0aWFsIGNvZGUgdG8gaW50cm9kdXNlIHRoZSAKLSAqIAkJCQkJCQkJCQkgIEF4aXMyIHJ1bnRpbWUgdG8gdGhlIGZyYW1ld29yayBmb3IgMTY4NzYyCi0gKiAyMDA3MDQyNiAgIDE4MzA0NiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoCi0gKiAyMDA3MDczMCAgIDE5NDc4NiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBhZGRpbmcgc2VydmxldGFwaSBqYXIgZmlsdGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUudXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgRmlsZVV0aWxzCi17Ci0JcHVibGljIEZpbGVVdGlscygpewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5RmlsZShTdHJpbmcgc3JjLCBTdHJpbmcgZGVzdCkgewotCQlJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0JCUZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbnVsbDsKLQotCQl0cnkKLQkJewotCQkJaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNyYyk7Ci0JCQlmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShkZXN0KTsKLQkJCWludCBjID0gMDsKLQkJCWJ5dGVbXSBhcnJheSA9IG5ldyBieXRlWzEwMjRdOwotCQkJd2hpbGUgKChjID0gaXMucmVhZChhcnJheSkpID49IDApewotCQkJCWZvcy53cml0ZShhcnJheSwgMCwgYyk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKQl7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCWZpbmFsbHkJewotCQkJdHJ5CXsKLQkJCQlmb3MuY2xvc2UoKTsKLQkJCQlpcy5jbG9zZSgpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKQl7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgRmlsZSBjcmVhdGVGaWxlQW5kUGFyZW50RGlyZWN0b3JpZXMoU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZU5hbWUpOwotCQlGaWxlIHBhcmVudCA9IGZpbGUuZ2V0UGFyZW50RmlsZSgpOwotCQlpZiAoIXBhcmVudC5leGlzdHMoKSl7Ci0JCQlwYXJlbnQubWtkaXJzKCk7Ci0JCX0KLQkJZmlsZS5jcmVhdGVOZXdGaWxlKCk7Ci0JCXJldHVybiBmaWxlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZGVsZXRlRGlyKEZpbGUgZGlyKSB7Ci0gICAgICAgIGlmIChkaXIuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgU3RyaW5nW10gY2hpbGRyZW4gPSBkaXIubGlzdCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gZGVsZXRlRGlyKG5ldyBGaWxlKGRpciwgY2hpbGRyZW5baV0pKTsKLSAgICAgICAgICAgICAgICBpZiAoIXN1Y2Nlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGlyLmRlbGV0ZSgpOwotICAgIH0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVEaXJlY3RvcmllcyhGaWxlIGRpcikgewotCQlGaWxlW10gY2hpbGRyZW4gPSBkaXIubGlzdEZpbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspewotCQkJaWYgKGNoaWxkcmVuW2ldLmxpc3QoKSAhPSBudWxsICYmIGNoaWxkcmVuW2ldLmxpc3QoKS5sZW5ndGggPiAwKXsKLQkJCQlkZWxldGVEaXJlY3RvcmllcyhjaGlsZHJlbltpXSk7Ci0JCQl9Ci0JCQllbHNlewotCQkJCWNoaWxkcmVuW2ldLmRlbGV0ZSgpOwotCQkJfQotCQl9Ci0JCWRpci5kZWxldGUoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlRGlyZWN0b3JpZXMoU3RyaW5nIGRpcikgewotCQlGaWxlIGRpcmVjdG9yeSA9IG5ldyBGaWxlKGRpcik7Ci0JCWRlbGV0ZURpcmVjdG9yaWVzKGRpcmVjdG9yeSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZVRhcmdldEZpbGUoU3RyaW5nIHNvdXJjZUZpbGVOYW1lLCBTdHJpbmcgdGFyZ2V0RmlsZU5hbWUpIAotCQkJCQkJCXRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUYXJnZXRGaWxlKHNvdXJjZUZpbGVOYW1lLCB0YXJnZXRGaWxlTmFtZSwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVUYXJnZXRGaWxlKFN0cmluZyBzb3VyY2VGaWxlTmFtZSwgU3RyaW5nIHRhcmdldEZpbGVOYW1lLCAKLQkJCQkJCWJvb2xlYW4gb3ZlcndyaXRlKSB0aHJvd3MgRXhjZXB0aW9uewotCQlGaWxlIGlkZWFsUmVzdWx0RmlsZSA9IG5ldyBGaWxlKHRhcmdldEZpbGVOYW1lKTsKLQkJaWYgKG92ZXJ3cml0ZSB8fCAhaWRlYWxSZXN1bHRGaWxlLmV4aXN0cygpKQotCQl7Ci0JCQlGaWxlVXRpbHMuY3JlYXRlRmlsZUFuZFBhcmVudERpcmVjdG9yaWVzKHRhcmdldEZpbGVOYW1lKTsKLQkJCUZpbGVVdGlscy5jb3B5RmlsZShzb3VyY2VGaWxlTmFtZSwgdGFyZ2V0RmlsZU5hbWUpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNyZWF0ZURpcmVjdG9yeShTdHJpbmcgZGlyZWN0b3J5KXsKLQkJLy8gQ3JlYXRlIGEgZGlyZWN0b3J5OyBhbGwgYW5jZXN0b3IgZGlyZWN0b3JpZXMgbXVzdCBleGlzdAotCQlib29sZWFuIHN1Y2Nlc3MgPSAobmV3IEZpbGUoZGlyZWN0b3J5KSkubWtkaXIoKTsKLQkJaWYgKCFzdWNjZXNzKSB7Ci0JCQkvLyBEaXJlY3RvcnkgY3JlYXRpb24gZmFpbGVkCi0JCX0KLQkJcmV0dXJuIHN1Y2Nlc3M7ICAKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY3JlYXRlRGlyZWN0b3J5cyhTdHJpbmcgZGlyZWN0b3J5KXsKLQkJLy8gQ3JlYXRlIGEgZGlyZWN0b3J5OyBhbGwgYW5jZXN0b3IgZGlyZWN0b3JpZXMgbXVzdCBleGlzdAotCQlib29sZWFuIHN1Y2Nlc3MgPSAobmV3IEZpbGUoZGlyZWN0b3J5KSkubWtkaXJzKCk7Ci0JCWlmICghc3VjY2VzcykgewotCQkJLy8gRGlyZWN0b3J5IGNyZWF0aW9uIGZhaWxlZAotCQl9Ci0JCXJldHVybiBzdWNjZXNzOyAgCi0JfQotCi0JLy9Db3BpZXMgYWxsIGZpbGVzIHVuZGVyIHNyY0RpciB0byBkc3REaXIuCi0JLy8gSWYgZHN0RGlyIGRvZXMgbm90IGV4aXN0LCBpdCB3aWxsIGJlIGNyZWF0ZWQuCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvcHlEaXJlY3RvcnkoRmlsZSBzcmNEaXIsIEZpbGUgZHN0RGlyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoc3JjRGlyLmlzRGlyZWN0b3J5KCkpIHsKLQkJCWlmICghZHN0RGlyLmV4aXN0cygpKSB7Ci0JCQkJZHN0RGlyLm1rZGlyKCk7Ci0JCQl9Ci0KLQkJCVN0cmluZ1tdIGNoaWxkcmVuID0gc3JjRGlyLmxpc3QoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCWNvcHlEaXJlY3RvcnkobmV3IEZpbGUoc3JjRGlyLCBjaGlsZHJlbltpXSksCi0JCQkJCQluZXcgRmlsZShkc3REaXIsIGNoaWxkcmVuW2ldKSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQljb3B5KHNyY0RpciwgZHN0RGlyKTsKLQkJfQotCX0KLQotCS8vQ29waWVzIHNyYyBmaWxlIHRvIGRzdCBmaWxlLgotCS8vIElmIHRoZSBkc3QgZmlsZSBkb2VzIG5vdCBleGlzdCwgaXQgaXMgY3JlYXRlZAotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5KEZpbGUgc3JjLCBGaWxlIGRzdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNyYyk7Ci0JCU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShkc3QpOwotCi0JCS8vIFRyYW5zZmVyIGJ5dGVzIGZyb20gaW4gdG8gb3V0Ci0JCWJ5dGVbXSBidWYgPSBuZXcgYnl0ZVsxMDI0XTsKLQkJaW50IGxlbjsKLQkJd2hpbGUgKChsZW4gPSBpbi5yZWFkKGJ1ZikpID4gMCkgewotCQkJb3V0LndyaXRlKGJ1ZiwgMCwgbGVuKTsKLQkJfQotCQlpbi5jbG9zZSgpOwotCQlvdXQuY2xvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRBbm90aGVyTm9kZVRvUGF0aChTdHJpbmcgY3VycmVudFBhdGgsIFN0cmluZyBuZXdOb2RlKSB7Ci0JCXJldHVybiBjdXJyZW50UGF0aCArIEZpbGUuc2VwYXJhdG9yICsgbmV3Tm9kZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkTm9kZXNUb1BhdGgoU3RyaW5nIGN1cnJlbnRQYXRoLCBTdHJpbmdbXSBuZXdOb2RlKSB7Ci0JCVN0cmluZyByZXR1cm5QYXRoPWN1cnJlbnRQYXRoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5ld05vZGUubGVuZ3RoOyBpKyspIHsKLQkJCXJldHVyblBhdGggPSByZXR1cm5QYXRoICsgRmlsZS5zZXBhcmF0b3IgKyBuZXdOb2RlW2ldOwotCQl9Ci0JCXJldHVybiByZXR1cm5QYXRoOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhZGROb2Rlc1RvUGF0aChTdHJpbmdCdWZmZXIgY3VycmVudFBhdGgsIFN0cmluZ1tdIHBhdGhOb2RlcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhdGhOb2Rlcy5sZW5ndGg7IGkrKyl7Ci0JCQljdXJyZW50UGF0aC5hcHBlbmQoRmlsZS5zZXBhcmF0b3IpOwotCQkJY3VycmVudFBhdGguYXBwZW5kKHBhdGhOb2Rlc1tpXSk7Ci0JCX0KLQkJcmV0dXJuIGN1cnJlbnRQYXRoLnRvU3RyaW5nKCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFkZE5vZGVzVG9VUkwoU3RyaW5nIGN1cnJlbnRQYXRoLCBTdHJpbmdbXSBuZXdOb2RlKSB7Ci0JCVN0cmluZyByZXR1cm5QYXRoPWN1cnJlbnRQYXRoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5ld05vZGUubGVuZ3RoOyBpKyspIHsKLQkJCXJldHVyblBhdGggPSByZXR1cm5QYXRoICsgIi8iICsgbmV3Tm9kZVtpXTsKLQkJfQotCQlyZXR1cm4gcmV0dXJuUGF0aDsKLQl9Ci0JCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBsaXN0IG9mIGZpbGUgd2l0aCBhIHByZWZpeCBvZiA8Y29kZT5maWxlTmFtZVByZWZpeDwvY29kZT4gJmFtcDsgYW4gZXh0ZW5zaW9uIG9mCi0gICAgICogPGNvZGU+ZXh0ZW5zaW9uPC9jb2RlPgotICAgICAqCi0gICAgICogQHBhcmFtIHNvdXJjZURpciAgICAgIFRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggdG8gc2VhcmNoIHRoZSBmaWxlcwotICAgICAqIEBwYXJhbSBmaWxlTmFtZVByZWZpeCBUaGUgcHJlZml4IHRvIGxvb2sgZm9yCi0gICAgICogQHBhcmFtIGV4dGVuc2lvbiAgICAgIFRoZSBleHRlbnNpb24gdG8gbG9vayBmb3IKLSAgICAgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIGZpbGUgd2l0aCBhIHByZWZpeCBvZiA8Y29kZT5maWxlTmFtZVByZWZpeDwvY29kZT4gJmFtcDsgYW4gZXh0ZW5zaW9uIG9mCi0gICAgICogICAgICAgICA8Y29kZT5leHRlbnNpb248L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBGaWxlW10gZ2V0TWF0Y2hpbmdGaWxlcyhTdHJpbmcgc291cmNlRGlyLCBTdHJpbmcgZmlsZU5hbWVQcmVmaXgsIFN0cmluZyBleHRlbnNpb24pIHsKLSAgICAgICAgTGlzdCBmaWxlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgRmlsZSBsaWJEaXIgPSBuZXcgRmlsZShzb3VyY2VEaXIpOwotICAgICAgICBTdHJpbmcgbGliRGlyUGF0aCA9IGxpYkRpci5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgU3RyaW5nW10gaXRlbXMgPSBsaWJEaXIubGlzdCgpOwotICAgICAgICBpZiAoaXRlbXMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIFN0cmluZyBpdGVtID0gaXRlbXNbaV07Ci0gICAgICAgICAgICAgICAgaWYgKGZpbGVOYW1lUHJlZml4ICE9IG51bGwgJiYgZXh0ZW5zaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uc3RhcnRzV2l0aChmaWxlTmFtZVByZWZpeCkgJiYgaXRlbS5lbmRzV2l0aChleHRlbnNpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlTGlzdC5hZGQobmV3IEZpbGUobGliRGlyUGF0aCArIEZpbGUuc2VwYXJhdG9yICsgaXRlbSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaWxlTmFtZVByZWZpeCA9PSBudWxsICYmIGV4dGVuc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLmVuZHNXaXRoKGV4dGVuc2lvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVMaXN0LmFkZChuZXcgRmlsZShsaWJEaXJQYXRoICsgRmlsZS5zZXBhcmF0b3IgKyBpdGVtKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpbGVOYW1lUHJlZml4ICE9IG51bGwgJiYgZXh0ZW5zaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uc3RhcnRzV2l0aChmaWxlTmFtZVByZWZpeCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVMaXN0LmFkZChuZXcgRmlsZShsaWJEaXJQYXRoICsgRmlsZS5zZXBhcmF0b3IgKyBpdGVtKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmaWxlTGlzdC5hZGQobmV3IEZpbGUobGliRGlyUGF0aCArIEZpbGUuc2VwYXJhdG9yICsgaXRlbSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAoRmlsZVtdKSBmaWxlTGlzdC50b0FycmF5KG5ldyBGaWxlW2ZpbGVMaXN0LnNpemUoKV0pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgRmlsZVswXTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogRmlsdGVyIG91dCBmaWxlcyBpbnNpZGUgYSA8Y29kZT5zb3VyY2VEaXI8L2NvZGU+IHdpdGggbWF0Y2hpbmcgPGNvZGVmaWxlTmFtZVByZWZpeD48L2NvZGU+Ci0gICAgICogYW5kIDxjb2RlPmV4dGVuc2lvbjwvY29kZT4KLSAgICAgKiBAcGFyYW0gc291cmNlRGlyIAkJVGhlIGRpcmVjdG9yeSB0byBmaWx0ZXIgdGhlIGZpbGVzCi0gICAgICogQHBhcmFtIGZpbGVOYW1lUHJlZml4CVRoZSBmaWx0ZXJpbmcgZmlsZW5hbWUgcHJlZml4IAotICAgICAqIEBwYXJhbSBleHRlbnNpb24JCQlUaGUgZmlsdGVyaW5nIGZpbGUgZXh0ZW5zaW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGZpbHRlck91dFJlc3RyaWN0ZWRGaWxlcyhTdHJpbmcgc291cmNlRGlyLCBTdHJpbmcgZmlsZU5hbWVQcmVmaXgsIFN0cmluZyBleHRlbnNpb24pewotICAgIAlGaWxlW10gcmVzdWx0ZWRNYXRjaGluZ0ZpbGVzID0gZ2V0TWF0Y2hpbmdGaWxlcyhzb3VyY2VEaXIsIGZpbGVOYW1lUHJlZml4LCBleHRlbnNpb24pOwotICAgIAlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdGVkTWF0Y2hpbmdGaWxlcy5sZW5ndGg7IGkrKykgewotCQkJRmlsZSBtYXRjaGluZ0ZpbGVQYXRoID0gbmV3IEZpbGUocmVzdWx0ZWRNYXRjaGluZ0ZpbGVzW2ldLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCW1hdGNoaW5nRmlsZVBhdGguZGVsZXRlKCk7Ci0JCX0KLSAgICB9Ci0gICAgCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb3JlL3V0aWxzL1J1bnRpbWVQcm9wZXJ0eVV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29yZS91dGlscy9SdW50aW1lUHJvcGVydHlVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDNhMjkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb3JlL3V0aWxzL1J1bnRpbWVQcm9wZXJ0eVV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBXU08yIEluYy4gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogV1NPMiBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDcwMTMwICAgMTY4NzYyIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgY29kZSB0byBpbnRyb2R1c2UgdGhlIEF4aXMyIAotICogCQkJCQkJCQkJCSAgcnVudGltZSB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjIKLSAqIDIwMDcwNDI2ICAgMTgzMDQ2IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgKLSAqIDIwMDcwNTAxICAgMTgwMjg0IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgKLSAqIDIwMDcwODI0ICAgMjAwNTE1IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIE5PTi1OTFMgbW92ZSB0byBzZXBlcmF0ZSBmaWxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUudXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUuY29uc3RhbnQuQXhpczJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUucGx1Z2luLm1lc3NhZ2VzLkF4aXMyQ29yZVVJTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBSdW50aW1lUHJvcGVydHlVdGlscyB7Ci0JcHJpdmF0ZSBzdGF0aWMgRmlsZSBQcm9wZXJ0aWVzRmlsZURpcixzZXJ2ZXJQcm9wZXJ0aWVzRmlsZSxzdGF0dXNQcm9wZXJ0eUZpbGUsd2FyUHJvcGVydHlGaWxlOwotCXByaXZhdGUgc3RhdGljIElTdGF0dXMgc3RhdHVzOwotCXByaXZhdGUgc3RhdGljIFByb3BlcnRpZXMgcHJvcGVydGllczsKLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGluaXQoKXsKLQkJUHJvcGVydGllc0ZpbGVEaXIgPSBuZXcgRmlsZShBeGlzMkNvcmVVdGlscy50ZW1wQXhpczJEaXJlY3RvcnkoKSk7Ci0JCWlmICghUHJvcGVydGllc0ZpbGVEaXIuZXhpc3RzKCkpewotCQkJUHJvcGVydGllc0ZpbGVEaXIubWtkaXJzKCk7Ci0JCX0KLQkJcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgc2VydmVyUHJvcGVydGllc0ZpbGVJbml0KCkgdGhyb3dzIElPRXhjZXB0aW9uewotCQlzZXJ2ZXJQcm9wZXJ0aWVzRmlsZSA9IG5ldyBGaWxlKEF4aXMyQ29yZVV0aWxzLnRlbXBBeGlzMldlYmFwcEZpbGVMb2NhdGlvbigpKTsKLQkJaWYgKCFzZXJ2ZXJQcm9wZXJ0aWVzRmlsZS5leGlzdHMoKSl7Ci0JCQlzZXJ2ZXJQcm9wZXJ0aWVzRmlsZS5jcmVhdGVOZXdGaWxlKCk7Ci0JCX0KLQkJcHJvcGVydGllcy5sb2FkKG5ldyBGaWxlSW5wdXRTdHJlYW0oc2VydmVyUHJvcGVydGllc0ZpbGUpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBzdGF0dXNQcm9wZXJ0aWVzRmlsZUluaXQoKSB0aHJvd3MgSU9FeGNlcHRpb257Ci0JCXN0YXR1c1Byb3BlcnR5RmlsZSA9IG5ldyBGaWxlKEF4aXMyQ29yZVV0aWxzLnRlbXBSdW50aW1lU3RhdHVzRmlsZUxvY2F0aW9uKCkpOwotCQlpZiAoIXN0YXR1c1Byb3BlcnR5RmlsZS5leGlzdHMoKSl7Ci0JCQlzdGF0dXNQcm9wZXJ0eUZpbGUuY3JlYXRlTmV3RmlsZSgpOwotCQl9Ci0JCXByb3BlcnRpZXMubG9hZChuZXcgRmlsZUlucHV0U3RyZWFtKHN0YXR1c1Byb3BlcnR5RmlsZSkpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHdhclByb3BlcnRpZXNGaWxlSW5pdCgpIHRocm93cyBJT0V4Y2VwdGlvbnsKLQkJd2FyUHJvcGVydHlGaWxlID0gbmV3IEZpbGUoQXhpczJDb3JlVXRpbHMudGVtcFdhclN0YXR1c0ZpbGVMb2NhdGlvbigpKTsKLQkJaWYgKCF3YXJQcm9wZXJ0eUZpbGUuZXhpc3RzKCkpewotCQkJd2FyUHJvcGVydHlGaWxlLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJfQotCQlwcm9wZXJ0aWVzLmxvYWQobmV3IEZpbGVJbnB1dFN0cmVhbSh3YXJQcm9wZXJ0eUZpbGUpKTsKLQl9Ci0JCi0JCi0JCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIHdyaXRlU2VydmVyUGF0aFRvUHJvcGVydGllc0ZpbGUoU3RyaW5nIGF4aXMyUGF0aCkgewotCQkvL0ZpeCBmb3IgcHJvcGVydGllcyBmaWxlIHNraXBwaW5nIHRoZSBGaWxlIHNlcGVyYXRvciBjaGFyYWN0b3IgCi0JCS8vIG9uIHdpbmRvd3Mgd2hlbiBsb2FkaW5nIGFnYWluCi0JCVN0cmluZyBheGlzMlBhdGhOZXcgPSBudWxsOwotCQlpZiAoKGF4aXMyUGF0aC5pbmRleE9mKCJcXCIpKSAhPSAtMSkgewotCQkJYXhpczJQYXRoTmV3ID0gYXhpczJQYXRoLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3IsIEZpbGUuc2VwYXJhdG9yK0ZpbGUuc2VwYXJhdG9yKTs7Ci0JCX1lbHNlewotCQkJYXhpczJQYXRoTmV3PWF4aXMyUGF0aDsKLQkJfQotCQl0cnkgewotCQkJaW5pdCgpOwotCQkJc2VydmVyUHJvcGVydGllc0ZpbGVJbml0KCk7Ci0JCQlpZighIChwcm9wZXJ0aWVzLnNpemUoKT09IDApKXsKLQkJCQlpZihwcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KEF4aXMyQ29uc3RhbnRzLlBST1BFUlRZX0tFWV9QQVRIKSl7Ci0JCQkJCXByb3BlcnRpZXMucmVtb3ZlKEF4aXMyQ29uc3RhbnRzLlBST1BFUlRZX0tFWV9QQVRIKTsKLQkJCQl9Ci0JCQl9Ci0JCQkJQXhpczJDb3JlVXRpbHMud3JpdGVQcm9wZXJ0eVRvRmlsZShzZXJ2ZXJQcm9wZXJ0aWVzRmlsZSwgCi0JCQkJCQlBeGlzMkNvbnN0YW50cy5QUk9QRVJUWV9LRVlfUEFUSCwKLQkJCQkJCQkJCQkJCSAgIGF4aXMyUGF0aE5ldyk7Ci0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQl1cGRhdGVTdGF0dXNFcnJvcigpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl1cGRhdGVTdGF0dXNFcnJvcigpOwotCQl9Ci0JCQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTZXJ2ZXJQYXRoRnJvbVByb3BlcnRpZXNGaWxlKCl7Ci0JCWluaXQoKTsKLQkJU3RyaW5nIHNlcnZlclBhdGggPSBudWxsOwotCQlzZXJ2ZXJQcm9wZXJ0aWVzRmlsZSA9IG5ldyBGaWxlKEF4aXMyQ29yZVV0aWxzLnRlbXBBeGlzMldlYmFwcEZpbGVMb2NhdGlvbigpKTsKLQkJaWYgKCFzZXJ2ZXJQcm9wZXJ0aWVzRmlsZS5leGlzdHMoKSl7Ci0JCQl1cGRhdGVTdGF0dXNFcnJvcigpOwkJCQotCQl9Ci0JCXRyeSB7Ci0JCQlwcm9wZXJ0aWVzLmxvYWQobmV3IEZpbGVJbnB1dFN0cmVhbShzZXJ2ZXJQcm9wZXJ0aWVzRmlsZSkpOwotCQkJaWYocHJvcGVydGllcy5jb250YWluc0tleShBeGlzMkNvbnN0YW50cy5QUk9QRVJUWV9LRVlfUEFUSCkpewotCQkJCXNlcnZlclBhdGggPSBwcm9wZXJ0aWVzLmdldFByb3BlcnR5KEF4aXMyQ29uc3RhbnRzLlBST1BFUlRZX0tFWV9QQVRIKTsKLQkJCX0KLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCXVwZGF0ZVN0YXR1c0Vycm9yKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXVwZGF0ZVN0YXR1c0Vycm9yKCk7Ci0JCX0KLQkJcmV0dXJuIHNlcnZlclBhdGg7Ci0JfQotCQotCQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyB3cml0ZVNlcnZlclN0YXVzVG9Qcm9wZXJ0aWVzRmlsZShTdHJpbmcgcnVudGltZVN0YXR1cykgewotCQl0cnkgewotCQkJaW5pdCgpOwotCQkJc3RhdHVzUHJvcGVydGllc0ZpbGVJbml0KCk7Ci0JCQlpZighIChwcm9wZXJ0aWVzLnNpemUoKT09IDApKXsKLQkJCQlpZihwcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KEF4aXMyQ29uc3RhbnRzLlBST1BFUlRZX0tFWV9TVEFUVVMpKXsKLQkJCQkJcHJvcGVydGllcy5yZW1vdmUoQXhpczJDb25zdGFudHMuUFJPUEVSVFlfS0VZX1NUQVRVUyk7Ci0JCQkJfQotCQkJfQotCQkJQXhpczJDb3JlVXRpbHMud3JpdGVQcm9wZXJ0eVRvRmlsZShzdGF0dXNQcm9wZXJ0eUZpbGUsIAotCQkJCQlBeGlzMkNvbnN0YW50cy5QUk9QRVJUWV9LRVlfU1RBVFVTLCAKLQkJICAgICAgICAgICAgcnVudGltZVN0YXR1cyk7Ci0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQl1cGRhdGVTdGF0dXNFcnJvcigpOyAKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdXBkYXRlU3RhdHVzRXJyb3IoKTsKLQkJfQotCQkKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIHdyaXRlV2FyU3RhdXNUb1Byb3BlcnRpZXNGaWxlKGJvb2xlYW4gd2FyU3RhdHVzKSB7Ci0JCXRyeSB7Ci0JCQlpbml0KCk7Ci0JCQl3YXJQcm9wZXJ0aWVzRmlsZUluaXQoKTsKLQkJCWlmKCEgKHByb3BlcnRpZXMuc2l6ZSgpPT0gMCkpewotCQkJCWlmKHByb3BlcnRpZXMuY29udGFpbnNLZXkoQXhpczJDb25zdGFudHMuUFJPUEVSVFlfS0VZX1NUQVRVUykpewotCQkJCQlwcm9wZXJ0aWVzLnJlbW92ZShBeGlzMkNvbnN0YW50cy5QUk9QRVJUWV9LRVlfU1RBVFVTKTsKLQkJCQl9Ci0JCQl9Ci0JCQlBeGlzMkNvcmVVdGlscy53cml0ZVByb3BlcnR5VG9GaWxlKHdhclByb3BlcnR5RmlsZSwgCi0JCQkJCUF4aXMyQ29uc3RhbnRzLlBST1BFUlRZX0tFWV9TVEFUVVMsIAotCQkgICAgICAgICAgICBTdHJpbmcudmFsdWVPZih3YXJTdGF0dXMpKTsKLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCXVwZGF0ZVN0YXR1c0Vycm9yKCk7IAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl1cGRhdGVTdGF0dXNFcnJvcigpOwotCQl9Ci0JCQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0V2FyU3RhdHVzRnJvbVByb3BlcnRpZXNGaWxlKCl7Ci0JCWluaXQoKTsKLQkJYm9vbGVhbiB3YXJTdGF0dXMgPSBmYWxzZTsKLQkJd2FyUHJvcGVydHlGaWxlID0gbmV3IEZpbGUoQXhpczJDb3JlVXRpbHMudGVtcFdhclN0YXR1c0ZpbGVMb2NhdGlvbigpKTsKLQkJaWYgKCF3YXJQcm9wZXJ0eUZpbGUuZXhpc3RzKCkpewotCQkJdXBkYXRlU3RhdHVzRXJyb3IoKTsJCQkKLQkJfQotCQl0cnkgewotCQkJcHJvcGVydGllcy5sb2FkKG5ldyBGaWxlSW5wdXRTdHJlYW0od2FyUHJvcGVydHlGaWxlKSk7Ci0JCQlpZihwcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KEF4aXMyQ29uc3RhbnRzLlBST1BFUlRZX0tFWV9TVEFUVVMpKXsKLQkJCQl3YXJTdGF0dXMgPSBCb29sZWFuLnBhcnNlQm9vbGVhbigKLQkJCQkJCXByb3BlcnRpZXMuZ2V0UHJvcGVydHkoQXhpczJDb25zdGFudHMuUFJPUEVSVFlfS0VZX1NUQVRVUykpOwotCQkJfQotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJdXBkYXRlU3RhdHVzRXJyb3IoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdXBkYXRlU3RhdHVzRXJyb3IoKTsKLQkJfQotCQlyZXR1cm4gd2FyU3RhdHVzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgdXBkYXRlU3RhdHVzRXJyb3IoKXsKLQkJCXN0YXR1cyA9IG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsIAotCQkJCQkiaWQiLCAKLQkJCQkJMCwgCi0JCQkJCUF4aXMyQ29yZVVJTWVzc2FnZXMuRVJST1JfSU5WQUxJRF9BWElTMl9TRVJWRVJfTE9DQVRJT04sIAotCQkJCQludWxsICk7IAotCQl9Ci0JCQotCX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9mYWNldC9jb21tYW5kcy9BeGlzMldlYnNlcnZpY2VzU2VydmVyQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2ZhY2V0L2NvbW1hbmRzL0F4aXMyV2Vic2VydmljZXNTZXJ2ZXJDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMDcyYjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2ZhY2V0L2NvbW1hbmRzL0F4aXMyV2Vic2VydmljZXNTZXJ2ZXJDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBXU08yIEluYy4gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogV1NPMiBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDcwMjEzICAxNjg3NjYgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgSW5pdGlhbCBjb2RlIHRvIGludHJvZHVzZSB0aGUgQXhpczIgCi0gKiAJCQkJCQkJCQkJICBmYWNldCB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjYKLSAqIDIwMDcwNDI2ICAgMTgzMDQ2IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgKLSAqIDIwMDcwNTAxICAgMTgwMjg0IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgKLSAqIDIwMDcwNTIzICAgMTc0ODc2IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIFBlcnNpc3QgUHJlZmVyZW5jZXMgaW5zaWRlIEZyYW1ld29yawotICogMjAwNzA2MDYgICAxNzc0MjEgc2FuZGFraXRoQHdzbzIuY29tIC0gZml4IHdlYi54bWwgd2lwZWQgb3V0IHdoZW4gQXhpczIgZmFjZXQKLSAqIDIwMDcwODA4ICAgMTk0OTA2IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEZpeGluZyAxOTQ5MDYgUnVudGltZSBsaWIgaXNzdWUKLSAqIDIwMDcwODI0ICAgMjAwNTE1IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIE5PTi1OTFMgbW92ZSB0byBzZXBlcmF0ZSBmaWxlCi0gKiAyMDA3MTAxMSAgIDIwNTk3MiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBBeGlzMiBMaWJyYXJpZXMgTGljZW5zZSBmaWxlcyBmaXgKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuZmFjZXQuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUuY29uc3RhbnQuQXhpczJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUuY29udGV4dC5BeGlzMkVtaXR0ZXJDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLnBsdWdpbi5XZWJTZXJ2aWNlQXhpczJDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLnBsdWdpbi5tZXNzYWdlcy5BeGlzMkNvcmVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLnV0aWxzLkF4aXMyQ29yZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLnV0aWxzLkZhY2V0Q29udGFpbmVyVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUudXRpbHMuRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLnV0aWxzLlJ1bnRpbWVQcm9wZXJ0eVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5mYWNldC51dGlscy5BeGlzMlJ1bnRpbWVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuZmFjZXQudXRpbHMuQXhpczJXZWJhcHBVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuZmFjZXQudXRpbHMuQ29udGVudENvcHlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgQXhpczJXZWJzZXJ2aWNlc1NlcnZlckNvbW1hbmQgZXh0ZW5kcwotQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gewotCi0JSVByb2plY3QgcHJvamVjdDsKLQlBeGlzMkVtaXR0ZXJDb250ZXh0IGNvbnRleHQ7Ci0JCi0JcHVibGljIEF4aXMyV2Vic2VydmljZXNTZXJ2ZXJDb21tYW5kKElQcm9qZWN0IHByb2plY3QpewotCQljb250ZXh0ID0gV2ViU2VydmljZUF4aXMyQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QXhpc0VtaXR0ZXJDb250ZXh0KCk7Ci0JCXRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykKLQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGVPdmVycmlkZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpICB7Ci0JCS8vQ29weSB0aGUgYXhpczIgZmFjZXQgaW4gdG8gdGhpcyBwcm9qZWN0Ci0JCUlTdGF0dXMgc3RhdHVzID1udWxsOwotCQlTdHJpbmcgcnVudGltZUxvY2F0aW9uID0gbnVsbDsKLQkJQ29udGVudENvcHlVdGlscyBjb250ZW50Q29weVV0aWxzID0gbmV3IENvbnRlbnRDb3B5VXRpbHMoKTsKLQkJdHJ5IHsKLQkJCWlmKGNvbnRleHQuaXNBeGlzMlNlcnZlclBhdGhSZXByZXNlbnRzV2FyKCkgCi0JCQkJCXx8IFJ1bnRpbWVQcm9wZXJ0eVV0aWxzLmdldFdhclN0YXR1c0Zyb21Qcm9wZXJ0aWVzRmlsZSgpKXsKLQkJCQlydW50aW1lTG9jYXRpb24gPSBBeGlzMlJ1bnRpbWVVdGlscy5jb3B5QXhpczJXYXIoCi0JCQkJCQkJCQkJCQkJCW1vbml0b3IsCi0JCQkJCQkJCQkJCQkJCUF4aXMyQ29uc3RhbnRzLlBST1BFUlRZX0tFWV9QQVRIKTsKLQkJCX1lbHNlewotCi0JCQkJcnVudGltZUxvY2F0aW9uID0gQXhpczJXZWJhcHBVdGlscy5jb3B5QXhpczJXYXIoCi0JCQkJCQkJCQkJCQkJCW1vbml0b3IsCi0JCQkJCQkJCQkJCQkJCUF4aXMyQ29uc3RhbnRzLlBST1BFUlRZX0tFWV9QQVRIKTsKLQkJCX0KLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBoYW5kbGVFeGNlcHRpb25TdGF0dXMoZSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBoYW5kbGVFeGNlcHRpb25TdGF0dXMoZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gaGFuZGxlRXhjZXB0aW9uU3RhdHVzKGUpOwotCQl9Ci0JCQotCQkvL0ZpcnN0IFNldHRpbmcgdGhlIGxpYnMgZm9sZGVyIGFzIGlnbm9yZWQgYW5kIHRoZW4gY29weSB0aGUgY29udGVudCBvZiB0aGUgcnVudGltZQotCQlJUGF0aCBsaWJQYXRoID0gbmV3IFBhdGgocnVudGltZUxvY2F0aW9uKTsKLQkJbGliUGF0aCA9IGxpYlBhdGguYXBwZW5kKEF4aXMyQ29uc3RhbnRzLkRJUl9XRUJfSU5GKTsKLQkJbGliUGF0aCA9IGxpYlBhdGguYXBwZW5kKEF4aXMyQ29uc3RhbnRzLkRJUl9MSUIpOwotCQlMaXN0PFN0cmluZz4gaWdub3JlTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlpZ25vcmVMaXN0LmFkZChsaWJQYXRoLnRvT1NTdHJpbmcoKSk7Ci0JCWNvbnRlbnRDb3B5VXRpbHMudXBkYXRlQ2hlY2tMaXN0KGlnbm9yZUxpc3QpOwotCQkKLQkJc3RhdHVzID0gY29udGVudENvcHlVdGlscy5jb3B5RGlyZWN0b3J5UmVjdXJzaXZlbHlJbnRvV29ya3NwYWNlKAotCQkJCXJ1bnRpbWVMb2NhdGlvbiwgCi0JCQkJRmFjZXRDb250YWluZXJVdGlscy5wYXRoVG9XZWJQcm9qZWN0Q29udGFpbmVyKHByb2plY3QudG9TdHJpbmcoKSksIAotCQkJCW1vbml0b3IsCi0JCQkJZmFsc2UKLQkJKTsKLQkJCi0JCS8vIEFmdGVyIHRoYXQgY29weSB0aGUgbmVzZXNzZXJ5IHNldCBvZiBsaWJyYXJpZXMgdG8gdGhlIHByb2plY3QgYWdhaW4KLQkJTGlzdDxTdHJpbmc+IGluY2x1ZGVMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWNvbnRlbnRDb3B5VXRpbHMudXBkYXRlQ2hlY2tMaXN0KGxvYWRJbmNsdWRlTGlzdFdpdGhBeGlzMkxpYnMobGliUGF0aC50b09TU3RyaW5nKCksCi0JCQkJaW5jbHVkZUxpc3QpKTsKLQkJU3RyaW5nW10gbm9kZXMgPSB7QXhpczJDb25zdGFudHMuRElSX1dFQl9JTkYsQXhpczJDb25zdGFudHMuRElSX0xJQn07Ci0JCXN0YXR1cyA9IGNvbnRlbnRDb3B5VXRpbHMuY29weURpcmVjdG9yeVJlY3Vyc2l2ZWx5SW50b1dvcmtzcGFjZSgKLQkJCQlsaWJQYXRoLnRvT1NTdHJpbmcoKSwgCi0JCQkJRmlsZVV0aWxzLmFkZE5vZGVzVG9QYXRoKAotCQkJCQkJRmFjZXRDb250YWluZXJVdGlscy5wYXRoVG9XZWJQcm9qZWN0Q29udGFpbmVyKHByb2plY3QudG9TdHJpbmcoKSksIAotCQkJCQkJbm9kZXMpLCAKLQkJCQltb25pdG9yLAotCQkJCXRydWUKLQkJKTsKLQotCQkvL01lcmdlIHdlYi54bWwgRmlsZXMKLQkJTWVyZ2VXRUJYTUxDb21tYW5kIG1lcmdlV2ViWE1MQ29tbWFuZCA9IG5ldyBNZXJnZVdFQlhNTENvbW1hbmQoKTsKLQkJbWVyZ2VXZWJYTUxDb21tYW5kLnNldEV4dHJhQXhpczJUYWdzQWRkZWQoZmFsc2UpOwotCQltZXJnZVdlYlhNTENvbW1hbmQuc2V0U2VydmVyUHJvamVjdChwcm9qZWN0KTsKLQkJbWVyZ2VXZWJYTUxDb21tYW5kLmV4ZXh1dGVPdmVycmlkZShtb25pdG9yKTsKLQotCQkvL2NsZWFuIHVwIHRlbXBlcnkgZmlsZXMKLQkJRmlsZSB0ZW1wRmFjZXREaXJlY3RvcnkgPSBuZXcgRmlsZShydW50aW1lTG9jYXRpb24pOwotCQlpZiAodGVtcEZhY2V0RGlyZWN0b3J5LmV4aXN0cygpICYmIGNvbnRleHQuaXNBeGlzMlNlcnZlclBhdGhSZXByZXNlbnRzV2FyKCkpIHsKLQkJCUZpbGVVdGlscy5kZWxldGVEaXIodGVtcEZhY2V0RGlyZWN0b3J5KTsKLQkJfQotCQlzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY2xlYW51cElmRmFjZXRTdGF0dXNGYWlsZWQoU3RyaW5nIHJ1bnRpbWVMb2NhdGlvbil7Ci0JCUZpbGUgdGVtcEZhY2V0RGlyZWN0b3J5ID0gbmV3IEZpbGUocnVudGltZUxvY2F0aW9uKTsKLQkJaWYgKHRlbXBGYWNldERpcmVjdG9yeS5leGlzdHMoKSkgewotCQkJRmlsZVV0aWxzLmRlbGV0ZURpcih0ZW1wRmFjZXREaXJlY3RvcnkpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgSVN0YXR1cyBoYW5kbGVFeGNlcHRpb25TdGF0dXMoRXhjZXB0aW9uIGUpewotCQlJU3RhdHVzIHN0YXR1cyA9IG51bGw7Ci0JCXN0YXR1cyA9IG5ldyBTdGF0dXMoMSxwcm9qZWN0LnRvU3RyaW5nKCksMSxBeGlzMkNvcmVVSU1lc3NhZ2VzLkVSUk9SX1NFUlZFUl9JU19OT1RfU0VULGUpOwotCQljbGVhbnVwSWZGYWNldFN0YXR1c0ZhaWxlZChBeGlzMkNvcmVVdGlscy50ZW1wQXhpczJEaXJlY3RvcnkoKSk7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCQotCS8qKgotCSAqIExvYWQgdGhlIGV4YWN0IGxpYnJhcmllcyBsaXN0IGZyb20gdGhlIGF4aXMyIGphcnMgd2l0aCB0aGUgY29ycmVjdCB2ZXJzaW9ucyB0byB0aGUgCi0JICogPGNvZGU+cGF0aDwvY29kZT4uIERvaW5nIGl0IHRoaXMgd2F5IGludHJvZHVjZSB0aGUgc2NhbGFiaWxpdHkgdG8gdGhlIHNvbHV0aW9uIAotCSAqIHdoZXJlIHRoZSBuZWVkIGNvbWVzIGluIHRoZSBmdXR1cmUgcmVsZWFzZXMgdG8gaW5jbHVkZSBhZGRpdGlvbmFsIGxpYnJhcmllcyBhbmQgCi0JICogaWYgbmVlZGVkIGZpbHRlciBvdXQgc29tZSBsaWJyYXJpZXMuCi0JICogQHBhcmFtIHJ1bnRpbWVMb2NhdGlvbgotCSAqIEBwYXJhbSBpbmNsdWRlTGlzdAotCSAqIEByZXR1cm4gbG9hZGVkIGxpc3QKLQkgKi8KLQlwcml2YXRlIExpc3QgbG9hZEluY2x1ZGVMaXN0V2l0aEF4aXMyTGlicyhTdHJpbmcgcGF0aCwgTGlzdCBpbmNsdWRlTGlzdCl7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgQXhpczJDb25zdGFudHMuQVhJUzJfTElCX1BSRUZJWEVTLmxlbmd0aDsgaSsrKSB7Ci0JCQlGaWxlW10gamFyRmlsZUxpc3QgPSBGaWxlVXRpbHMuZ2V0TWF0Y2hpbmdGaWxlcyhwYXRoLAotCQkJCQlBeGlzMkNvbnN0YW50cy5BWElTMl9MSUJfUFJFRklYRVNbaV0sIAotCQkJCQlBeGlzMkNvbnN0YW50cy5KQVIpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBqYXJGaWxlTGlzdC5sZW5ndGg7IGorKykgewotCQkJCWluY2x1ZGVMaXN0LmFkZChqYXJGaWxlTGlzdFtqXS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQl9Ci0JCQkvL0ZpeCBmb3IgdGhlIDIwNTk3MiAKLQkJCUZpbGVbXSBsaWNlbnNlRmlsZUxpc3QgPSBGaWxlVXRpbHMuZ2V0TWF0Y2hpbmdGaWxlcyhwYXRoLAotCQkJCQlBeGlzMkNvbnN0YW50cy5BWElTMl9MSUJfUFJFRklYRVNbaV0sIAotCQkJCQlBeGlzMkNvbnN0YW50cy5UWFQpOwotCQkJZm9yIChpbnQgayA9IDA7IGsgPCBsaWNlbnNlRmlsZUxpc3QubGVuZ3RoOyBrKyspIHsKLQkJCQlpbmNsdWRlTGlzdC5hZGQobGljZW5zZUZpbGVMaXN0W2tdLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5jbHVkZUxpc3Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2ZhY2V0L2NvbW1hbmRzL01lcmdlV0VCWE1MQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2ZhY2V0L2NvbW1hbmRzL01lcmdlV0VCWE1MQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmFjOGZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9mYWNldC9jb21tYW5kcy9NZXJnZVdFQlhNTENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IFdTTzIgSW5jLCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiBXU08yIEluYy4gLSBtb2RpZmllZCBhbmQgZml4IHdlYi54bWwgd2lwZWQgb3V0IHdoZW4gQXhpczIgZmFjZXQKLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA1MTUgICAxMTUyMjUgc2VuZ3BsQGNhLmlibS5jb20gLSBTZW5nIFBodW5nLUx1Ci0gKiAyMDA3MDYwNiAgIDE3NzQyMSBzYW5kYWtpdGhAd3NvMi5jb20gLSBmaXggd2ViLnhtbCB3aXBlZCBvdXQgd2hlbiBBeGlzMiBmYWNldAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5mYWNldC5jb21tYW5kczsKLQotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuTW9kZWxQcm92aWRlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRXJyb3JDb2RlRXJyb3JQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGlzcGxheU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFlZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlVybFBhdHRlcm5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1c1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBNZXJnZVdFQlhNTENvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiB7Ci0KLQlwcml2YXRlIElQcm9qZWN0IHNlcnZlclByb2plY3Q7Ci0JcHJpdmF0ZSBib29sZWFuIGV4dHJhQXhpczJUYWdzQWRkZWQgPSBmYWxzZTsKLQotICBwdWJsaWMgTWVyZ2VXRUJYTUxDb21tYW5kKCApIHsKLSAgfQotCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZSggSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGFkYXB0YWJsZSApewotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0JCi0JcHVibGljIElTdGF0dXMgZXhleHV0ZU92ZXJyaWRlKCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpewotCQlJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBnZXRFbnZpcm9ubWVudCgpOwotCQlpZiAoc2VydmVyUHJvamVjdCAhPSBudWxsKSB7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IG51bGw7Ci0JCQlzdGF0dXMgPSBtZXJnZVdlYlhNTChnZXRBeGlzU2VydmxldERlc2NyaXB0b3IoKSk7Ci0JCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SKSB7Ci0JCQkJZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0JCQkJcmV0dXJuIHN0YXR1czsKLQkJCX0KLQkJCXN0YXR1cyA9IG1lcmdlV2ViWE1MKGdldEFkbWludFNlcnZsZXREZXNjcmlwdG9yKCkpOwotCQkJaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUikgewotCQkJCWVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQkJCXJldHVybiBzdGF0dXM7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCQotCXByaXZhdGUgSVN0YXR1cyBtZXJnZVdlYlhNTChmaW5hbCBTZXJ2bGV0RGVzY3JpcHRvciBzZXJ2bGV0RGVzY3JpcHRvcil7Ci0JCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJZmluYWwgSU1vZGVsUHJvdmlkZXIgcHJvdmlkZXIgPSBNb2RlbFByb3ZpZGVyTWFuYWdlci5nZXRNb2RlbFByb3ZpZGVyKHNlcnZlclByb2plY3QpOwotCQlwcm92aWRlci5tb2RpZnkobmV3IFJ1bm5hYmxlKCl7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJT2JqZWN0IG9iamVjdCA9IHByb3ZpZGVyLmdldE1vZGVsT2JqZWN0KCk7Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCl7Ci0JCQkJCW9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCBqYXZhZWVXZWJBcHAgPSAKLQkJCQkJCQkJCShvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHApIG9iamVjdDsKLQkJCQkJYWRkSmF2YWVlU2VydmxldChzZXJ2ZXJQcm9qZWN0LCBzZXJ2bGV0RGVzY3JpcHRvciwgamF2YWVlV2ViQXBwKTsKLQkJCQl9Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcCl7Ci0JCQkJCVdlYkFwcCB3ZWJBcHAgPSAoV2ViQXBwKSBvYmplY3Q7Ci0JCQkJCWFkZFNlcnZsZXQoc2VydmVyUHJvamVjdCwgc2VydmxldERlc2NyaXB0b3IsIHdlYkFwcCk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCX0sIG51bGwpOwotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQkKLQlwcml2YXRlIFNlcnZsZXREZXNjcmlwdG9yIGdldEF4aXNTZXJ2bGV0RGVzY3JpcHRvcigpIHsKLQotCQlTZXJ2bGV0RGVzY3JpcHRvciBzZCA9IG5ldyBTZXJ2bGV0RGVzY3JpcHRvcigpOwotCQlzZC5fbmFtZSA9ICJBeGlzU2VydmxldCI7IC8vJE5PTi1OTFMtMSQKLQkJc2QuX2Rpc3BsYXlOYW1lID0gIkFwYWNoZS1BeGlzIFNlcnZsZXQiOyAvLyROT04tTkxTLTEkCi0JCXNkLl9jbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5BeGlzU2VydmxldCI7IC8vJE5PTi1OTFMtMSQKLQkJc2QuX21hcHBpbmdzID0gbmV3IFN0cmluZ1tdIHsgIi9zZXJ2bGV0L0F4aXNTZXJ2bGV0IiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCSIqLmp3cyIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkiL3NlcnZpY2VzLyoiIH07IC8vJE5PTi1OTFMtMSQKLQkJLy9zZC5fbG9hZE9uU3RhcnR1cCA9IG5ldyBJbnRlZ2VyKDEpOwotCQlyZXR1cm4gc2Q7Ci0JfQotCi0JcHJpdmF0ZSBTZXJ2bGV0RGVzY3JpcHRvciBnZXRBZG1pbnRTZXJ2bGV0RGVzY3JpcHRvcigpIHsKLQkJU2VydmxldERlc2NyaXB0b3Igc2QgPSBuZXcgU2VydmxldERlc2NyaXB0b3IoKTsKLQkJc2QuX25hbWUgPSAiQXhpc0FkbWluU2VydmxldCI7IC8vJE5PTi1OTFMtMSQKLQkJc2QuX2Rpc3BsYXlOYW1lID0gIkFwYWNoZS1BeGlzIEFkbWluIFNlcnZsZXQgV2ViIEFkbWluIjsgLy8kTk9OLU5MUy0xJAotCQlzZC5fY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQXhpc0FkbWluU2VydmxldCI7IC8vJE5PTi1OTFMtMSQKLQkJc2QuX21hcHBpbmdzID0gbmV3IFN0cmluZ1tdIHsgIi9heGlzMi1hZG1pbi8qIgl9OyAvLyROT04tTkxTLTEkCi0JCXNkLl9sb2FkT25TdGFydHVwID0gbmV3IEludGVnZXIoMTAwKTsKLQkJcmV0dXJuIHNkOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIGFkZFNlcnZsZXQoSVByb2plY3Qgd2ViUHJvamVjdCwgU2VydmxldERlc2NyaXB0b3Igc2VydmxldERlc2NyaXB0b3IsCi0JCQkJCQkJCQkJCQkJCQkJCQkJV2ViQXBwIHdlYmFwcCkgewotCQl0cnkgewotCQkJICAgTGlzdCB0aGVTZXJ2bGV0cyA9IHdlYmFwcC5nZXRTZXJ2bGV0cygpOwotCQkJICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGVTZXJ2bGV0cy5zaXplKCk7IGkrKykgewotCQkJCVNlcnZsZXQgYVNlcnZsZXQgPSAoU2VydmxldCkgdGhlU2VydmxldHMuZ2V0KGkpOwotCQkJCWlmIChhU2VydmxldC5nZXRTZXJ2bGV0TmFtZSgpLmVxdWFscyhzZXJ2bGV0RGVzY3JpcHRvci5fbmFtZSkpIHsKLQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJIH0KLQkJCSAgIH0KLQkJCSAgIAotCQkJICAgV2ViYXBwbGljYXRpb25GYWN0b3J5IGZhY3RvcnkgPSBXZWJhcHBsaWNhdGlvbkZhY3RvcnkuZUlOU1RBTkNFOwotCi0JCQkgICBTZXJ2bGV0IHNlcnZsZXQgPSBmYWN0b3J5LmNyZWF0ZVNlcnZsZXQoKTsKLQkJCSAgIFNlcnZsZXRUeXBlIHNlcnZsZXRUeXBlID0gZmFjdG9yeS5jcmVhdGVTZXJ2bGV0VHlwZSgpOwotCQkJICAgc2VydmxldC5zZXRXZWJUeXBlKHNlcnZsZXRUeXBlKTsKLQkJCSAgIHNlcnZsZXQuc2V0U2VydmxldE5hbWUoc2VydmxldERlc2NyaXB0b3IuX25hbWUpOwotCQkJICAgc2VydmxldFR5cGUuc2V0Q2xhc3NOYW1lKHNlcnZsZXREZXNjcmlwdG9yLl9jbGFzc05hbWUpOwotCQkJICAgaWYoc2VydmxldERlc2NyaXB0b3IuX2Rpc3BsYXlOYW1lICE9IG51bGwpewotCQkJICAgICBzZXJ2bGV0LnNldERpc3BsYXlOYW1lKHNlcnZsZXREZXNjcmlwdG9yLl9kaXNwbGF5TmFtZSk7Ci0JCQkgICB9Ci0JCQkgICBpZihzZXJ2bGV0RGVzY3JpcHRvci5fbG9hZE9uU3RhcnR1cCAhPSBudWxsKXsKLQkJCQkgIHNlcnZsZXQuc2V0TG9hZE9uU3RhcnR1cChzZXJ2bGV0RGVzY3JpcHRvci5fbG9hZE9uU3RhcnR1cCk7Ci0JCQkgICB9Ci0JCQkgICBpZihzZXJ2bGV0RGVzY3JpcHRvci5fcGFyYW1zICE9IG51bGwpewotCQkJCSAgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gc2VydmxldC5nZXRQYXJhbXNBc1Byb3BlcnRpZXMoKTsKLQkJCQkgIHByb3BlcnRpZXMucHV0QWxsKHNlcnZsZXREZXNjcmlwdG9yLl9wYXJhbXMpOwotCQkJICAgfQotCQkJICAgd2ViYXBwLmdldFNlcnZsZXRzKCkuYWRkKHNlcnZsZXQpOwotCQkJCi0JCQkgICBpZihzZXJ2bGV0RGVzY3JpcHRvci5fbWFwcGluZ3MgIT0gbnVsbCl7Ci0JCQkJICBmb3IoaW50IGk9MDsgaTxzZXJ2bGV0RGVzY3JpcHRvci5fbWFwcGluZ3MubGVuZ3RoOyBpKyspewotCQkJCQlTZXJ2bGV0TWFwcGluZyBzZXJ2bGV0TWFwcGluZyA9IGZhY3RvcnkuY3JlYXRlU2VydmxldE1hcHBpbmcoKTsKLQkJCQkJc2VydmxldE1hcHBpbmcuc2V0U2VydmxldChzZXJ2bGV0KTsKLQkJCQkJc2VydmxldE1hcHBpbmcuc2V0VXJsUGF0dGVybihzZXJ2bGV0RGVzY3JpcHRvci5fbWFwcGluZ3NbaV0pOwotCQkJCQl3ZWJhcHAuZ2V0U2VydmxldE1hcHBpbmdzKCkuYWRkKHNlcnZsZXRNYXBwaW5nKTsJCQkJCQotCQkJCSAgfQotCQkJICAgfQotCQkJICAgCi0JCQkgICBpZiAoIWV4dHJhQXhpczJUYWdzQWRkZWQpIHsKLQkJCQkgICAgLy9hZGQgdGhlIHdlbGNvbWUgZmlsZSBsaXN0Ci0JCQkJICAgIHdlYmFwcC5nZXRGaWxlTGlzdCgpLmFkZEZpbGVOYW1lZCgiL2F4aXMyLXdlYi9pbmRleC5qc3AiKTsKLQkJCQkgICAgCi0JCQkJICAgIC8vYWRkIHRoZSBlcnJvciBwYWdlcwotCQkJCSAgICBFcnJvckNvZGVFcnJvclBhZ2UgZXJyb3JQYWdlNDA0ID0gZmFjdG9yeS5jcmVhdGVFcnJvckNvZGVFcnJvclBhZ2UoKTsKLQkJCQkgICAgZXJyb3JQYWdlNDA0LnNldEVycm9yQ29kZSgiNDA0Iik7Ci0JCQkJICAgIGVycm9yUGFnZTQwNC5zZXRMb2NhdGlvbigiL2F4aXMyLXdlYi9FcnJvci9lcnJvcjQwNC5qc3AiKTsKLQkJCQkgICAgd2ViYXBwLmdldEVycm9yUGFnZXMoKS5hZGQoZXJyb3JQYWdlNDA0KTsKLQkJCQkgICAgCi0JCQkJICAgIEVycm9yQ29kZUVycm9yUGFnZSBlcnJvclBhZ2U1MDAgPSBmYWN0b3J5LmNyZWF0ZUVycm9yQ29kZUVycm9yUGFnZSgpOwotCQkJCSAgICBlcnJvclBhZ2U1MDAuc2V0RXJyb3JDb2RlKCI1MDAiKTsKLQkJCQkgICAgZXJyb3JQYWdlNTAwLnNldExvY2F0aW9uKCIvYXhpczItd2ViL0Vycm9yL2Vycm9yNTAwLmpzcCIpOwotCQkJCSAgICB3ZWJhcHAuZ2V0RXJyb3JQYWdlcygpLmFkZChlcnJvclBhZ2U1MDApOwotCQkJCSAgICBleHRyYUF4aXMyVGFnc0FkZGVkID0gdHJ1ZTsKLQkJCSAgIH0KLQkJCSAgIAotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0KLQkJCXJldHVybiBTdGF0dXNVdGlscy5lcnJvclN0YXR1cygKLQkJCQkJIk1TR19FUlJPUl9VUERBVEVfV0VCX1hNTCIsCi0JCQkJCWUpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRKYXZhZWVTZXJ2bGV0KElQcm9qZWN0IHdlYlByb2plY3QsIFNlcnZsZXREZXNjcmlwdG9yIHNlcnZsZXREZXNjcmlwdG9yLAotCQkJb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwIHdlYmFwcCkgewotCQlMaXN0IHRoZVNlcnZsZXRzID0gd2ViYXBwLmdldFNlcnZsZXRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGhlU2VydmxldHMuc2l6ZSgpOyBpKyspIHsKLQkJCW9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQgYVNlcnZsZXQgPSAKLQkJCQkJCQkJKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQpIHRoZVNlcnZsZXRzLmdldChpKTsKLQkJCWlmIChhU2VydmxldC5nZXRTZXJ2bGV0TmFtZSgpLmVxdWFscyhzZXJ2bGV0RGVzY3JpcHRvci5fbmFtZSkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJV2ViRmFjdG9yeSBmYWN0b3J5ID0gV2ViRmFjdG9yeS5lSU5TVEFOQ0U7Ci0JCW9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQgc2VydmxldCA9IGZhY3RvcnkuY3JlYXRlU2VydmxldCgpOwotCQlzZXJ2bGV0LnNldFNlcnZsZXROYW1lKHNlcnZsZXREZXNjcmlwdG9yLl9uYW1lKTsKLQkJc2VydmxldC5zZXRTZXJ2bGV0Q2xhc3Moc2VydmxldERlc2NyaXB0b3IuX2NsYXNzTmFtZSk7Ci0JCWlmKHNlcnZsZXREZXNjcmlwdG9yLl9kaXNwbGF5TmFtZSAhPSBudWxsKXsKLQkJCURpc3BsYXlOYW1lIGRpc3BsYXlOYW1lT2JqID0gSmF2YWVlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGlzcGxheU5hbWUoKTsKLQkJCWRpc3BsYXlOYW1lT2JqLnNldFZhbHVlKHNlcnZsZXREZXNjcmlwdG9yLl9kaXNwbGF5TmFtZSk7Ci0JCQlzZXJ2bGV0LmdldERpc3BsYXlOYW1lcygpLmFkZChkaXNwbGF5TmFtZU9iaik7ICAKLQkJfQotCQlpZihzZXJ2bGV0RGVzY3JpcHRvci5fbG9hZE9uU3RhcnR1cCAhPSBudWxsKXsKLQkJCXNlcnZsZXQuc2V0TG9hZE9uU3RhcnR1cChzZXJ2bGV0RGVzY3JpcHRvci5fbG9hZE9uU3RhcnR1cCk7Ci0JCX0KLQkJd2ViYXBwLmdldFNlcnZsZXRzKCkuYWRkKHNlcnZsZXQpOwotCQlpZihzZXJ2bGV0RGVzY3JpcHRvci5fbWFwcGluZ3MgIT0gbnVsbCl7Ci0JCQlmb3IoaW50IGk9MDsgaTxzZXJ2bGV0RGVzY3JpcHRvci5fbWFwcGluZ3MubGVuZ3RoOyBpKyspewotCQkJCW9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXRNYXBwaW5nIHNlcnZsZXRNYXBwaW5nID0gCi0JCQkJCQkJCQkJCQkJZmFjdG9yeS5jcmVhdGVTZXJ2bGV0TWFwcGluZygpOwkJCQotCQkJCXNlcnZsZXRNYXBwaW5nLnNldFNlcnZsZXROYW1lKHNlcnZsZXQuZ2V0U2VydmxldE5hbWUoKSk7Ci0JCQkJVXJsUGF0dGVyblR5cGUgdXJsID0gSmF2YWVlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVXJsUGF0dGVyblR5cGUoKTsKLQkJCQl1cmwuc2V0VmFsdWUoc2VydmxldERlc2NyaXB0b3IuX21hcHBpbmdzW2ldKTsKLQkJCQlzZXJ2bGV0TWFwcGluZy5nZXRVcmxQYXR0ZXJucygpLmFkZCh1cmwpOwotCQkJCXdlYmFwcC5nZXRTZXJ2bGV0TWFwcGluZ3MoKS5hZGQoc2VydmxldE1hcHBpbmcpOwkJCQkJCi0JCQl9Ci0JCX0KLQl9Ci0gIAotCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZlclByb2plY3QoSVByb2plY3Qgc2VydmVyUHJvamVjdCkgewotICAgIHRoaXMuc2VydmVyUHJvamVjdCA9IHNlcnZlclByb2plY3Q7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEV4dHJhQXhpczJUYWdzQWRkZWQoYm9vbGVhbiBmbGFnKSB7Ci0JICAgIHRoaXMuZXh0cmFBeGlzMlRhZ3NBZGRlZCA9IGZsYWc7Ci0gIH0KLQotCXB1YmxpYyBjbGFzcyBTZXJ2bGV0RGVzY3JpcHRvciB7Ci0JCVN0cmluZyBfbmFtZTsKLQkJU3RyaW5nIF9jbGFzc05hbWU7Ci0JCVN0cmluZyBfZGlzcGxheU5hbWU7Ci0JCU1hcCBfcGFyYW1zOwotCQlTdHJpbmdbXSBfbWFwcGluZ3M7Ci0JCUludGVnZXIgX2xvYWRPblN0YXJ0dXA7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvZmFjZXQvZGVsaWdhdGUvQXhpczJDb3JlRmFjZXRJbnN0YWxsRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9mYWNldC9kZWxpZ2F0ZS9BeGlzMkNvcmVGYWNldEluc3RhbGxEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmQ2OGVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9mYWNldC9kZWxpZ2F0ZS9BeGlzMkNvcmVGYWNldEluc3RhbGxEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBXU08yIEluYy4gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogV1NPMiBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDcwMjEzICAxNjg3NjYgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgSW5pdGlhbCBjb2RlIHRvIGludHJvZHVzZSB0aGUgQXhpczIgCi0gKiAJCQkJCQkJCQkJICBmYWNldCB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjYKLSAqIDIwMDcwNTAxICAgMTgwMjg0IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgKLSAqIDIwMDcwNjA2ICAgMTc3NDIxIHNhbmRha2l0aEB3c28yLmNvbSAtIGZpeCB3ZWIueG1sIHdpcGVkIG91dCB3aGVuIEF4aXMyIGZhY2V0Ci0gKiAyMDA3MDgyNCAgIDIwMDUxNSBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBOT04tTkxTIG1vdmUgdG8gc2VwZXJhdGUgZmlsZQotICogMjAwNzEwMTAgICAyMDQxODIga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4sIGNoZWNrIGZvciBYYWxhbiBUcmFuc2Zvcm1lckZhY3RvcnlJbXBsCi0gKiAyMDA4MDIxMyAgIDIxODkxMCBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5mYWNldC5kZWxpZ2F0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUuY29uc3RhbnQuQXhpczJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUucGx1Z2luLm1lc3NhZ2VzLkF4aXMyQ29yZVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUudXRpbHMuUnVudGltZVByb3BlcnR5VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmZhY2V0LmNvbW1hbmRzLkF4aXMyV2Vic2VydmljZXNTZXJ2ZXJDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotcHVibGljIGNsYXNzIEF4aXMyQ29yZUZhY2V0SW5zdGFsbERlbGVnYXRlIGltcGxlbWVudHMgSURlbGVnYXRlIHsKLQotCXByaXZhdGUgSVN0YXR1cyBzdGF0dXM7Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9qZWN0IHByb2plY3QsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGFyZzEsIE9iamVjdCBhcmcyLAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCW1vbml0b3IuYmVnaW5UYXNrKEF4aXMyQ29yZVVJTWVzc2FnZXMuUFJPR1JFU1NfSU5TVEFMTF9BWElTMl9SVU5USU1FLCAyICk7Ci0KLQkJQXhpczJXZWJzZXJ2aWNlc1NlcnZlckNvbW1hbmQgY29tbWFuZCA9IG5ldyBBeGlzMldlYnNlcnZpY2VzU2VydmVyQ29tbWFuZChwcm9qZWN0KTsgCi0JCXN0YXR1cyA9IGNvbW1hbmQuZXhlY3V0ZU92ZXJyaWRlKG1vbml0b3IpOwotCQlpZiAoc3RhdHVzLmdldENvZGUoKSA9PSBTdGF0dXMuT0tfU1RBVFVTLmdldENvZGUoKSApewotCQkJUnVudGltZVByb3BlcnR5VXRpbHMud3JpdGVTZXJ2ZXJTdGF1c1RvUHJvcGVydGllc0ZpbGUoCi0JCQkJCUF4aXMyQ29uc3RhbnRzLlNFUlZFUl9TVEFUVVNfUEFTUyk7Ci0JCX1lbHNlewotCQkJUnVudGltZVByb3BlcnR5VXRpbHMud3JpdGVTZXJ2ZXJTdGF1c1RvUHJvcGVydGllc0ZpbGUoCi0JCQkJCUF4aXMyQ29uc3RhbnRzLlNFUlZFUl9TVEFUVVNfRkFJTCk7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotCQl9Ci0JCW1vbml0b3Iud29ya2VkKCAxICk7Ci0JCW1vbml0b3IuZG9uZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2ZhY2V0L2RlbGlnYXRlL0F4aXMyQ29yZUZhY2V0VW5JbnN0YWxsRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9mYWNldC9kZWxpZ2F0ZS9BeGlzMkNvcmVGYWNldFVuSW5zdGFsbERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2MTA0YzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2ZhY2V0L2RlbGlnYXRlL0F4aXMyQ29yZUZhY2V0VW5JbnN0YWxsRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDIxMyAgMTY4NzY2IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgY29kZSB0byBpbnRyb2R1c2UgdGhlIEF4aXMyIAotICogMjAwNzA2MTEgIDE5MjAwMiBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotICogCQkJCQkJCQkJCSAgZmFjZXQgdG8gdGhlIGZyYW1ld29yayBmb3IgMTY4NzY2Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmZhY2V0LmRlbGlnYXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5wbHVnaW4ubWVzc2FnZXMuQXhpczJDb3JlVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBBeGlzMkNvcmVGYWNldFVuSW5zdGFsbERlbGVnYXRlIGltcGxlbWVudHMgSURlbGVnYXRlIHsKLQkKLQlwcml2YXRlIElTdGF0dXMgc3RhdHVzOwotCQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVByb2plY3QgcHJvamVjdCwgSVByb2plY3RGYWNldFZlcnNpb24gYXJnMSwgT2JqZWN0IGFyZzIsCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJbW9uaXRvci5iZWdpblRhc2soQXhpczJDb3JlVUlNZXNzYWdlcy5QUk9HUkVTU19VTklOU1RBTExfQVhJUzJfUlVOVElNRSwgMiApOwotCQkJLy8gVE9ETyByb2xsYmFjayB0aGUgZHluYW1pYyB3ZWIgcHJvamVjdCB0byB0aGUgcHJldmlvdXMgc3RhdGUuCi0JICAgICAgICBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQkJbW9uaXRvci53b3JrZWQoIDEgKTsKLQl9Ci0JCi0JcHVibGljIElTdGF0dXMgZ2V0U3RhdHVzKCl7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2ZhY2V0L2RlbGlnYXRlL0F4aXMyRXh0RmFjZXRJbnN0YWxsRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9mYWNldC9kZWxpZ2F0ZS9BeGlzMkV4dEZhY2V0SW5zdGFsbERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkN2Y1Y2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2ZhY2V0L2RlbGlnYXRlL0F4aXMyRXh0RmFjZXRJbnN0YWxsRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDIxMyAgMTY4NzY2IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgY29kZSB0byBpbnRyb2R1c2UgdGhlIEF4aXMyIAotICogCQkJCQkJCQkJCSAgZmFjZXQgdG8gdGhlIGZyYW1ld29yayBmb3IgMTY4NzY2Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmZhY2V0LmRlbGlnYXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgQXhpczJFeHRGYWNldEluc3RhbGxEZWxlZ2F0ZSBpbXBsZW1lbnRzIElEZWxlZ2F0ZSB7Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9qZWN0IGFyZzAsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGFyZzEsIE9iamVjdCBhcmcyLAotCQkJSVByb2dyZXNzTW9uaXRvciBhcmczKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkvL1RPRE8gVGhpcyB3aWxsIGluY2x1ZGUgdGhlIG1vcmUgcmVxdWlyZW1lbnRzIHRoYXQgbmVlZGVkIHRvIGJlIGF1dG9tYXRlZAotCQkJLy8JICAgd2hlbiB3ZSBjb3ZlciB0aGUgb3RoZXIgUkZFIHMgaW4gZnV0dXJlLgotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9mYWNldC9kZWxpZ2F0ZS9BeGlzMkV4dEZhY2V0VW5JbnN0YWxsRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9mYWNldC9kZWxpZ2F0ZS9BeGlzMkV4dEZhY2V0VW5JbnN0YWxsRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRjNzFjZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvZmFjZXQvZGVsaWdhdGUvQXhpczJFeHRGYWNldFVuSW5zdGFsbERlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IFdTTzIgSW5jLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBXU08yIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzAyMTMgIDE2ODc2NiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbml0aWFsIGNvZGUgdG8gaW50cm9kdXNlIHRoZSBBeGlzMiAKLSAqIAkJCQkJCQkJCQkgIGZhY2V0IHRvIHRoZSBmcmFtZXdvcmsgZm9yIDE2ODc2NgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5mYWNldC5kZWxpZ2F0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotcHVibGljIGNsYXNzIEF4aXMyRXh0RmFjZXRVbkluc3RhbGxEZWxlZ2F0ZSBpbXBsZW1lbnRzIElEZWxlZ2F0ZSB7Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9qZWN0IGFyZzAsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGFyZzEsIE9iamVjdCBhcmcyLAotCQkJSVByb2dyZXNzTW9uaXRvciBhcmczKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkvL1RPRE8gVGhpcyB3aWxsIGluY2x1ZGUgdGhlIG1vcmUgcmVxdWlyZW1lbnRzIHRoYXQgbmVlZGVkIHRvIGJlIGF1dG9tYXRlZAotCQkJLy8JICAgd2hlbiB3ZSBjb3ZlciB0aGUgb3RoZXIgUkZFIHMgaW4gZnV0dXJlLgotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9mYWNldC9tZXNzYWdlcy9BeGlzMkZhY2V0VUkucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9mYWNldC9tZXNzYWdlcy9BeGlzMkZhY2V0VUkucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NkMTgzOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvZmFjZXQvbWVzc2FnZXMvQXhpczJGYWNldFVJLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBXU08yIEluYy4gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBXU08yIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSMgLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgMjAwNzAyMTQgICAxNjg3NjIgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgSW5pdGlhbCBjb2RlIHRvIGludHJvZHVzZSAKLSMgCQkJCQkJCQkJCSAgdGhlIEF4aXMyIGZhY2V0IHRvIHRoZSBmcmFtZXdvcmsgZm9yIDE2ODc2MgotIyAyMDA3MDUxNyAgIDE4NzMwNyBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBGaXggMTg3MzA3IFByb3BlcnR5IEZpbGUgRml4Ci0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2ZhY2V0L21lc3NhZ2VzL0F4aXMyRmFjZXRVSU1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvZmFjZXQvbWVzc2FnZXMvQXhpczJGYWNldFVJTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFlMGEyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvZmFjZXQvbWVzc2FnZXMvQXhpczJGYWNldFVJTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDIxMyAgMTY4NzY2IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgY29kZSB0byBpbnRyb2R1c2UgdGhlIEF4aXMyIAotICogCQkJCQkJCQkJCSAgZmFjZXQgdG8gdGhlIGZyYW1ld29yayBmb3IgMTY4NzY2Ci0gKiAyMDA3MDQyNiAgIDE4MzA0NiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoCi0gKiAyMDA3MDUxNyAgIDE4NzMwNyBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBGaXggMTg3MzA3IFByb3BlcnR5IEZpbGUgRml4Ci0gKiAyMDA3MDYwNiAgIDE3NzQyMSBzYW5kYWtpdGhAd3NvMi5jb20gLSBmaXggd2ViLnhtbCB3aXBlZCBvdXQgd2hlbiBBeGlzMiBmYWNldAotICogMjAwNzA3MzAgICAxOTQ3ODYgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgYWRkaW5nIHNlcnZsZXRhcGkgamFyIGZpbHRlcgotICogMjAwNzA4MDggICAxOTQ5MDYgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgRml4aW5nIDE5NDkwNiBSdW50aW1lIGxpYiBpc3N1ZQotICogMjAwNzA4MjQgICAyMDA1MTUgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgTk9OLU5MUyBtb3ZlIHRvIHNlcGVyYXRlIGZpbGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuZmFjZXQubWVzc2FnZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQXhpczJGYWNldFVJTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gCi0JCQkJIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5mYWNldC5tZXNzYWdlcy5BeGlzMkZhY2V0VUkiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQXhpczJGYWNldFVJTWVzc2FnZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEF4aXMyRmFjZXRVSU1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvZmFjZXQvbW9kZWwvRmFjZXRNb2RlbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2ZhY2V0L21vZGVsL0ZhY2V0TW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwZDY4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvZmFjZXQvbW9kZWwvRmFjZXRNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBXU08yIEluYy4gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogV1NPMiBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDcwMjIyICAxNjg3NjYgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgSW5pdGlhbCBjb2RlIHRvIGludHJvZHVzZSB0aGUgQXhpczIgCi0gKiAJCQkJCQkJCQkJICBmYWNldCB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjYKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuZmFjZXQubW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBGYWNldE1vZGVsIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgd2ViRmFjZXRDb25pbmVyRGlyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0V2ViRmFjZXRDb25pbmVyRGlyKCkgewotCQlyZXR1cm4gd2ViRmFjZXRDb25pbmVyRGlyOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRXZWJGYWNldENvbmluZXJEaXIoU3RyaW5nIGlucHV0V2ViRmFjZXRDb25pbmVyRGlyKSB7Ci0JCXdlYkZhY2V0Q29uaW5lckRpciA9IGlucHV0V2ViRmFjZXRDb25pbmVyRGlyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2ZhY2V0L3BsdWdpbi9BeGlzMkZhY2V0UGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvZmFjZXQvcGx1Z2luL0F4aXMyRmFjZXRQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk1ZTEzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvZmFjZXQvcGx1Z2luL0F4aXMyRmFjZXRQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDIxMyAgMTY4NzY2IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgY29kZSB0byBpbnRyb2R1c2UgdGhlIEF4aXMyIAotICogCQkJCQkJCQkJCSAgZmFjZXQgdG8gdGhlIGZyYW1ld29yayBmb3IgMTY4NzY2Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmZhY2V0LnBsdWdpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKi8KLXB1YmxpYyBjbGFzcyBBeGlzMkZhY2V0UGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuYXBhY2hlLmF4aXMyLmZhY2V0IjsKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBBeGlzMkZhY2V0UGx1Z2luIHBsdWdpbjsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgQXhpczJGYWNldFBsdWdpbigpIHsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBBeGlzMkZhY2V0UGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgQXhpczJGYWNldFBsdWdpbiBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0JCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZyggZmluYWwgRXhjZXB0aW9uIGUgKXsKLSAgICAgICAgZmluYWwgU3RyaW5nIG1zZyA9IGUuZ2V0TWVzc2FnZSgpICsgIiI7Ci0gICAgICAgIGxvZyggbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtc2csIGUgKSApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coIGZpbmFsIElTdGF0dXMgc3RhdHVzICl7Ci0gICAgICAgIGdldEluc3RhbmNlKCkuZ2V0TG9nKCkubG9nKCBzdGF0dXMgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKCBmaW5hbCBTdHJpbmcgbXNnICl7Ci0gICAgICAgIGxvZyggbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtc2csIG51bGwgKSApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjcmVhdGVFcnJvclN0YXR1cyggZmluYWwgU3RyaW5nIG1zZyApewotICAgICAgICByZXR1cm4gY3JlYXRlRXJyb3JTdGF0dXMoIG1zZywgbnVsbCApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjcmVhdGVFcnJvclN0YXR1cyggZmluYWwgU3RyaW5nIG1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEV4Y2VwdGlvbiBlICl7Ci0gICAgICAgIHJldHVybiBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIDAsIG1zZywgZSApOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2ZhY2V0L3V0aWxzL0F4aXMyUnVudGltZVV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvZmFjZXQvdXRpbHMvQXhpczJSdW50aW1lVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZlYmRiOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvZmFjZXQvdXRpbHMvQXhpczJSdW50aW1lVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IFdTTzIgSW5jLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBXU08yIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzAyMTMgIDE2ODc2NiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbml0aWFsIGNvZGUgdG8gaW50cm9kdXNlIHRoZSBBeGlzMiAKLSAqIAkJCQkJCQkJCQkgIGZhY2V0IHRvIHRoZSBmcmFtZXdvcmsgZm9yIDE2ODc2NgotICogMjAwNzA0MjYgICAxODMwNDYgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aAotICogMjAwNzA1MDEgICAxODAyODQgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aAotICogMjAwNzA1MTYgICAxODMxNDcgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCBGaXggZm9yIHRoZSBwZXJzaXN0aW5nIERCQ1MgcGF0aHMKLSAqIDIwMDcwNTIzICAgMTc0ODc2IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIFBlcnNpc3QgUHJlZmVyZW5jZXMgaW5zaWRlIEZyYW1ld29yawotICogMjAwNzA4MjQgICAyMDA1MTUgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgTk9OLU5MUyBtb3ZlIHRvIHNlcGVyYXRlIGZpbGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuZmFjZXQudXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5jb25zdGFudC5BeGlzMkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5jb250ZXh0LkF4aXMyRW1pdHRlckNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUucGx1Z2luLldlYlNlcnZpY2VBeGlzMkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUudXRpbHMuQXhpczJDb3JlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUudXRpbHMuRmlsZVV0aWxzOwotCi1wdWJsaWMgY2xhc3MgQXhpczJSdW50aW1lVXRpbHMgewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFpJUD0wLCBVTlpJUCA9IDE7Ci0JcHJvdGVjdGVkIHN0YXRpYyBpbnQgbW9kZSA9IFVOWklQOwotCXN0YXRpYyBaaXBGaWxlIHppcEZpbGU7Ci0JcHJvdGVjdGVkIHN0YXRpYyBieXRlW10gYjsKLQlzdGF0aWMgU29ydGVkU2V0IGNyZWF0ZWREaXJzOwotCXN0YXRpYyBTdHJpbmcgb3V0cHV0UGF0aDsKLQlzdGF0aWMgQXhpczJFbWl0dGVyQ29udGV4dCBjb250ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgIGNvcHlBeGlzMldhcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFN0cmluZyBBeGlzMkhvbWUpCi0JCQkJCQkJdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb257Ci0JCWNvbnRleHQgPSBXZWJTZXJ2aWNlQXhpczJDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRBeGlzRW1pdHRlckNvbnRleHQoKTsKLQkJU3RyaW5nIHRlbXBXYXJGaWxlID0gbnVsbDsKLQkJU3RyaW5nIHRlbXBXYXJMb2NhdGlvbiA9IG51bGw7Ci0JCVN0cmluZyAgdGVtcFVuemlwTG9jYXRpb24gPSBudWxsOwotCQl0cnkgewotCQkJaWYgKG5ldyBGaWxlIChBeGlzMkNvcmVVdGlscy50ZW1wQXhpczJEaXJlY3RvcnkoKSkuaXNEaXJlY3RvcnkoKSkgewotCQkJCXRlbXBXYXJMb2NhdGlvbiA9IEF4aXMyQ29yZVV0aWxzLmFkZEFub3RoZXJOb2RlVG9QYXRoKAotCQkJCQkJCQkJCQkJCQkJQXhpczJDb3JlVXRpbHMudGVtcEF4aXMyRGlyZWN0b3J5KCksCi0JCQkJCQkJCQkJCQkJCQlBeGlzMkNvbnN0YW50cy5ESVJfVEVNUFdBUik7Ci0JCQlGaWxlIHRlbXBXYXJMb2NhdGlvbkZpbGU9IG5ldyBGaWxlKHRlbXBXYXJMb2NhdGlvbik7Ci0JCQlpZiAodGVtcFdhckxvY2F0aW9uRmlsZS5leGlzdHMoKSkgewotCQkJCUZpbGVVdGlscy5kZWxldGVEaXJlY3Rvcmllcyh0ZW1wV2FyTG9jYXRpb25GaWxlKTsKLQkJCX0KLQkJCXRlbXBXYXJMb2NhdGlvbkZpbGUubWtkaXJzKCk7Ci0JCQl0ZW1wV2FyRmlsZSA9IEF4aXMyQ29yZVV0aWxzLmFkZEFub3RoZXJOb2RlVG9QYXRoKAotCQkJCQkJCQkJCQkJCQkJdGVtcFdhckxvY2F0aW9uLAkKLQkJCQkJCQkJCQkJCQkJCUF4aXMyQ29uc3RhbnRzLkZJTEVfQVhJUzJfV0FSKTsKLQkJCW5ldyBGaWxlKHRlbXBXYXJGaWxlKS5jcmVhdGVOZXdGaWxlKCk7Ci0JCQlTdHJpbmcgYXhpczJSdW50aW1yTG9jYXRpb24gPSBudWxsOwotCQkJaWYoY29udGV4dC5nZXRBeGlzMlJ1bnRpbWVMb2NhdGlvbigpIT1udWxsKXsKLQkJCQlheGlzMlJ1bnRpbXJMb2NhdGlvbiA9IGNvbnRleHQuZ2V0QXhpczJSdW50aW1lTG9jYXRpb24oKTsKLQkJCX1lbHNlewotCQkJICAgIEF4aXMyRW1pdHRlckNvbnRleHQgY29udGV4dCA9IFdlYlNlcnZpY2VBeGlzMkNvcmVQbHVnaW4KLQkJCQkJCQkJCQkJCS5nZXREZWZhdWx0KCkuZ2V0QXhpc0VtaXR0ZXJDb250ZXh0KCk7Ci0JCQkgICAgYXhpczJSdW50aW1yTG9jYXRpb24gPSAgY29udGV4dC5nZXRBeGlzMlJ1bnRpbWVMb2NhdGlvbigpOwotCi0JCQl9Ci0JCQkJCVN0cmluZyBheGlzMldhckZpbGUgPSBBeGlzMkNvcmVVdGlscy5hZGRBbm90aGVyTm9kZVRvUGF0aCgKLQkJCQkJCQkJCQlheGlzMlJ1bnRpbXJMb2NhdGlvbiwKLQkJCQkJCQkJCQlBeGlzMkNvbnN0YW50cy5GSUxFX0FYSVMyX1dBUik7Ci0JCQkJCUZpbGVDaGFubmVsIHNyY0NoYW5uZWwgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGF4aXMyV2FyRmlsZSkuZ2V0Q2hhbm5lbCgpOwotCQkJCQlGaWxlQ2hhbm5lbCBkc3RDaGFubmVsID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odGVtcFdhckZpbGUpLmdldENoYW5uZWwoKTsKLQkJCQkJLy8gQ29weSBmaWxlIGNvbnRlbnRzIGZyb20gc291cmNlIHRvIGRlc3RpbmF0aW9uCi0JCQkJCWRzdENoYW5uZWwudHJhbnNmZXJGcm9tKHNyY0NoYW5uZWwsIDAsIHNyY0NoYW5uZWwuc2l6ZSgpKTsKLQkJCQkJLy8gQ2xvc2UgdGhlIGNoYW5uZWxzCi0JCQkJCXNyY0NoYW5uZWwuY2xvc2UoKTsKLQkJCQkJZHN0Q2hhbm5lbC5jbG9zZSgpOwotCQkJCQotCQkJCS8vdW56aXAgdGhpcyBpbnRvIGFub3RoZXIgZm91bGRlcgotCQkJCXRlbXBVbnppcExvY2F0aW9uID0gRmlsZVV0aWxzLmFkZEFub3RoZXJOb2RlVG9QYXRoKHRlbXBXYXJMb2NhdGlvbiwgCi0JCQkJCQlBeGlzMkNvbnN0YW50cy5ESVJfVU5aSVApOwotCQkJCUZpbGUgdGVtcFVuemlwTG9jYXRpb25GaWxlPSBuZXcgRmlsZSh0ZW1wVW56aXBMb2NhdGlvbik7Ci0JCQkJaWYgKCF0ZW1wVW56aXBMb2NhdGlvbkZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJdGVtcFVuemlwTG9jYXRpb25GaWxlLm1rZGlycygpOwotCQkJCX0KLQkJCQl1bnppcEF4aXMyV2FyKHRlbXBXYXJGaWxlLHRlbXBVbnppcExvY2F0aW9uICk7Ci0KLQkJCQl9Ci0JCQkKLQkJCUlQYXRoIHRlbXBXZWJYTUxMb2NhdGlvblBhdGggPSBuZXcgUGF0aCh0ZW1wVW56aXBMb2NhdGlvbikKLQkJCQkJCQkJCQkJICAgLmFwcGVuZChBeGlzMkNvbnN0YW50cy5ESVJfV0VCX0lORikKLQkJCQkJCQkJCQkJICAgLmFwcGVuZChBeGlzMkNvbnN0YW50cy5GSUxFX1dFQl9YTUwpOwotCQkJLy9kZWxldGUgdGhlIGF4aXMyIHdlYi54bWwgRmlsZShEV1AgYWxyZWFkeSBoYXZlKQotCQkJbmV3IEZpbGUodGVtcFdlYlhNTExvY2F0aW9uUGF0aC50b09TU3RyaW5nKCkpLmRlbGV0ZSgpOwotCQkJCQotCQkJLy99IGVsc2UgewotCQkJCS8vVGhyb3dzIGFuIGVycm9yIG1lc3NhZ2UKLQkJCS8vfQotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgZTsJCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGU7Ci0JCX0KLQotCQlyZXR1cm4gdGVtcFVuemlwTG9jYXRpb247Ci0JfQotCQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgdW56aXBBeGlzMldhcihTdHJpbmcgZmlsZU5hbWUsU3RyaW5nIG91dHB1dFBhdGgpewotCSAgICAgIGIgPSBuZXcgYnl0ZVs4MDkyXTsKLQkgICAgICBzZXRPdXRwdXRQYXRoKG91dHB1dFBhdGgpOwotCSAgICAgIGlmIChmaWxlTmFtZS5lbmRzV2l0aCgiLndhciIpICkKLQkgICAgICAgIHVuWmlwKGZpbGVOYW1lKTsKLQkgICAgICBlbHNlCi0JICAgIAkgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIldyb25nIGZpbGUgdHlwZSIgKyBmaWxlTmFtZSk7Ci0JfQotCi0JLyoqIEZvciBhIGdpdmVuIFppcCBmaWxlLCBwcm9jZXNzIGVhY2ggZW50cnkuICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVuWmlwKFN0cmluZyBmaWxlTmFtZSkgewotCQotCSAgY3JlYXRlZERpcnMgPSBuZXcgVHJlZVNldCgpOwotCSAgdHJ5IHsKLQkgICAgemlwRmlsZSA9IG5ldyBaaXBGaWxlKGZpbGVOYW1lKTsKLQkgICAgRW51bWVyYXRpb24gYWxsID0gemlwRmlsZS5lbnRyaWVzKCk7Ci0JICAgIHdoaWxlIChhbGwuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkgICAgICB1bnppcEZpbGUoKFppcEVudHJ5KSBhbGwubmV4dEVsZW1lbnQoKSk7Ci0JICAgIH0KLQkgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLQkgIH0KLQl9Ci0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgdW56aXBGaWxlKFppcEVudHJ5IGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkgIGJvb2xlYW4gd2FybmVkTWtEaXIgPSBmYWxzZTsKLQkgICAgU3RyaW5nIHppcE5hbWUgPSBlLmdldE5hbWUoKTsKLQkgICAgc3dpdGNoIChtb2RlKSB7Ci0JICAgIGNhc2UgVU5aSVA6Ci0JICAgICAgaWYgKHppcE5hbWUuc3RhcnRzV2l0aCgiLyIpKSB7Ci0JICAgICAgICBpZiAoIXdhcm5lZE1rRGlyKQotCSAgICAgICAgd2FybmVkTWtEaXIgPSB0cnVlOwotCSAgICAgICAgemlwTmFtZSA9IHppcE5hbWUuc3Vic3RyaW5nKDEpOwotCSAgICAgIH0KLQkgICAgICBpZiAoemlwTmFtZS5lbmRzV2l0aCgiLyIpKSB7Ci0JICAgICAgICByZXR1cm47Ci0JICAgICAgfQotCSAgICAgIGludCBpeCA9IHppcE5hbWUubGFzdEluZGV4T2YoJy8nKTsKLQkgICAgICBpZiAoaXggPiAwKSB7Ci0JICAgICAgICBTdHJpbmcgZGlyTmFtZSA9IHppcE5hbWUuc3Vic3RyaW5nKDAsIGl4KTsKLQkgICAgICAgIGlmICghY3JlYXRlZERpcnMuY29udGFpbnMoZGlyTmFtZSkpIHsKLQkgICAgICAgICAgRmlsZSBkID0gbmV3IEZpbGUoZ2V0T3V0cHV0UGF0aCgpK0ZpbGUuc2VwYXJhdG9yK2Rpck5hbWUpOwotCSAgICAgICAgICBpZiAoIShkLmV4aXN0cygpICYmIGQuaXNEaXJlY3RvcnkoKSkpIHsKLQkgICAgICAgICAgICBpZiAoIWQubWtkaXJzKCkpIHsKLQkgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIldhcm5pbmc6IHVuYWJsZSB0byBta2RpciAiICsgZGlyTmFtZSk7Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgICAgIGNyZWF0ZWREaXJzLmFkZChkaXJOYW1lKTsKLQkgICAgICAgICAgfQotCSAgICAgICAgfQotCSAgICAgIH0KLSAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZ2V0T3V0cHV0UGF0aCgpK0ZpbGUuc2VwYXJhdG9yK3ppcE5hbWUpOwotCSAgICAgIElucHV0U3RyZWFtIGlzID0gemlwRmlsZS5nZXRJbnB1dFN0cmVhbShlKTsKLQkgICAgICBpbnQgbiA9IDA7Ci0JICAgICAgd2hpbGUgKChuID0gaXMucmVhZChiKSkgPiAwKQotCSAgICAgICAgb3Mud3JpdGUoYiwgMCwgbik7Ci0JICAgICAgaXMuY2xvc2UoKTsKLQkgICAgICBvcy5jbG9zZSgpOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm1vZGUgdmFsdWUgKCIgKyBtb2RlICsgIikgYmFkIik7Ci0JICAgIH0KLQkgIH0KLQotCQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0T3V0cHV0UGF0aCgpIHsKLQkJcmV0dXJuIG91dHB1dFBhdGg7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0T3V0cHV0UGF0aChTdHJpbmcgb3V0cHV0UGF0aCkgewotCQlBeGlzMlJ1bnRpbWVVdGlscy5vdXRwdXRQYXRoID0gb3V0cHV0UGF0aDsKLQl9Ci0KLQkJICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2ZhY2V0L3V0aWxzL0F4aXMyV2ViYXBwVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9mYWNldC91dGlscy9BeGlzMldlYmFwcFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNTM4ODguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2ZhY2V0L3V0aWxzL0F4aXMyV2ViYXBwVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IFdTTzIgSW5jLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBXU08yIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzA0MTAgMTY4NzY2IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgY29kZSB0byBpbnRyb2R1c2UgdGhlIEF4aXMyIAotICogCQkJCQkJCQkJCSAgZmFjZXQgdG8gdGhlIGZyYW1ld29yayBmb3IgMTY4NzY2Ci0gKiAyMDA3MDQyNiAgIDE4MzA0NiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoCi0gKiAyMDA3MDUwMSAgIDE4MDI4NCBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoCi0gKiAyMDA3MDUwNyAgIDE4NTY4NiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoCi0gKiAyMDA3MDUxNiAgIDE4MzE0NyBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoIEZpeCBmb3IgdGhlIHBlcnNpc3RpbmcgREJDUyBwYXRocwotICogMjAwNzA1MjMgICAxNzQ4NzYgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgUGVyc2lzdCBQcmVmZXJlbmNlcyBpbnNpZGUgRnJhbWV3b3JrCi0gKiAyMDA3MDczMCAgIDE5NDc4NiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBhZGRpbmcgc2VydmxldGFwaSBqYXIgZmlsdGVyCi0gKiAyMDA3MDgyNCAgIDIwMDUxNSBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBOT04tTkxTIG1vdmUgdG8gc2VwZXJhdGUgZmlsZQotICogMjAwNzExMjAgICAyMDUyMjggc2FuZGFraXRoQHdzbzIuY29tCS0gTGFoaXJ1IFNhbmRha2l0aCwgQXhpczIgUnVudGltZSBjaGFuZ2UgaXNzdWUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmZhY2V0LnV0aWxzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5jb25zdGFudC5BeGlzMkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5jb250ZXh0LkF4aXMyRW1pdHRlckNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUucGx1Z2luLldlYlNlcnZpY2VBeGlzMkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUudXRpbHMuQXhpczJDb3JlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUudXRpbHMuRmlsZVV0aWxzOwotCi1wdWJsaWMgY2xhc3MgQXhpczJXZWJhcHBVdGlscyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgdGVtcFdhckxvY2F0aW9uID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGFscmVhZHlXYXJFeGlzdCA9IGZhbHNlOwotCXByaXZhdGUgc3RhdGljIEF4aXMyRW1pdHRlckNvbnRleHQgY29udGV4dDsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgYXhpczJIb21lTG9jYXRpb24gPSBudWxsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgIGNvcHlBeGlzMldhcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFN0cmluZyBBeGlzMkhvbWUpCi0JCQkJCQkJCQkJdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb257Ci0JCWNvbnRleHQgPSBXZWJTZXJ2aWNlQXhpczJDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRBeGlzRW1pdHRlckNvbnRleHQoKTsKLQotCQlpZiggISAoIGFscmVhZHlXYXJFeGlzdCAmJiBjb250ZXh0LmdldEF4aXMyUnVudGltZUxvY2F0aW9uKCkuZXF1YWxzKGF4aXMySG9tZUxvY2F0aW9uKSApKXsKLQkJCWlmKGNvbnRleHQuZ2V0QXhpczJSdW50aW1lTG9jYXRpb24oKSAhPSBudWxsKXsKLQkJCQlheGlzMkhvbWVMb2NhdGlvbiA9IGNvbnRleHQuZ2V0QXhpczJSdW50aW1lTG9jYXRpb24oKTsKLQkJCX0KLQkJCUZpbGUgdGVtcEF4aXMyRGlyZWN0b3J5ID0gbmV3IEZpbGUgKEF4aXMyQ29yZVV0aWxzLnRlbXBBeGlzMkRpcmVjdG9yeSgpKTsKLQkJCWlmKCF0ZW1wQXhpczJEaXJlY3RvcnkuZXhpc3RzKCkpewotCQkJCXRlbXBBeGlzMkRpcmVjdG9yeS5ta2RpcnMoKTsKLQkJCX0KLQkJCWlmICh0ZW1wQXhpczJEaXJlY3RvcnkuaXNEaXJlY3RvcnkoKSkgewotCQkJCXRlbXBXYXJMb2NhdGlvbiA9IEF4aXMyQ29yZVV0aWxzLmFkZEFub3RoZXJOb2RlVG9QYXRoKAotCQkJCQkJQXhpczJDb3JlVXRpbHMudGVtcEF4aXMyRGlyZWN0b3J5KCksCi0JCQkJCQlBeGlzMkNvbnN0YW50cy5ESVJfRVhQTE9BREVEX1RFTVBXQVIpOwotCQkJCUZpbGUgdGVtcFdhckxvY2F0aW9uRmlsZT0gbmV3IEZpbGUodGVtcFdhckxvY2F0aW9uKTsKLQkJCQlpZiAodGVtcFdhckxvY2F0aW9uRmlsZS5leGlzdHMoKSkgewotCQkJCQlGaWxlVXRpbHMuZGVsZXRlRGlyZWN0b3JpZXModGVtcFdhckxvY2F0aW9uRmlsZSk7Ci0JCQkJfQotCQkJCXRlbXBXYXJMb2NhdGlvbkZpbGUubWtkaXJzKCk7Ci0JCQotCQkJCQlTdHJpbmcgYXhpczJXZWJhcHBMb2NhdGlvbiA9IEF4aXMyQ29yZVV0aWxzLmFkZEFub3RoZXJOb2RlVG9QYXRoKAotCQkJCQkJCWF4aXMySG9tZUxvY2F0aW9uLAotCQkJCQkJCSJ3ZWJhcHAiKTsKLQkJCQkJU3RyaW5nIGF4aXMyTGliRmlsZSA9IEF4aXMyQ29yZVV0aWxzLmFkZEFub3RoZXJOb2RlVG9QYXRoKAotCQkJCQkJCWF4aXMySG9tZUxvY2F0aW9uLAotCQkJCQkibGliIik7Ci0JCQkJCVN0cmluZyBheGlzMkNvbmZGaWxlID0gQXhpczJDb3JlVXRpbHMuYWRkQW5vdGhlck5vZGVUb1BhdGgoCi0JCQkJCQkJYXhpczJIb21lTG9jYXRpb24sCi0JCQkJCSJjb25mIik7Ci0JCQkJCVN0cmluZyBheGlzMlJlcG9zaXRvcnlGaWxlID0gQXhpczJDb3JlVXRpbHMuYWRkQW5vdGhlck5vZGVUb1BhdGgoCi0JCQkJCQkJYXhpczJIb21lTG9jYXRpb24sCi0JCQkJCSJyZXBvc2l0b3J5Iik7Ci0JCQkJCVN0cmluZyBheGlzMlRlbXBXZWJJbmZGaWxlID0gQXhpczJDb3JlVXRpbHMuYWRkQW5vdGhlck5vZGVUb1BhdGgoCi0JCQkJCQkJdGVtcFdhckxvY2F0aW9uLAotCQkJCQkiV0VCLUlORiIpOwotCQkJCQlTdHJpbmcgYXhpczJUZW1wV2ViSW5mTGliRmlsZSA9IEF4aXMyQ29yZVV0aWxzLmFkZEFub3RoZXJOb2RlVG9QYXRoKAotCQkJCQkJCWF4aXMyVGVtcFdlYkluZkZpbGUsCi0JCQkJCSJsaWIiKTsKLQkJCQkJU3RyaW5nIGF4aXMyVGVtcFdlYkluZkNvbmZGaWxlID0gQXhpczJDb3JlVXRpbHMuYWRkQW5vdGhlck5vZGVUb1BhdGgoCi0JCQkJCQkJYXhpczJUZW1wV2ViSW5mRmlsZSwKLQkJCQkJImNvbmYiKTsKLQkJCQkJU3RyaW5nIGF4aXMyVGVtcFdlYkJ1aWxkRmlsZSA9IEF4aXMyQ29yZVV0aWxzLmFkZEFub3RoZXJOb2RlVG9QYXRoKAotCQkJCQkJCXRlbXBXYXJMb2NhdGlvbiwKLQkJCQkJImJ1aWxkLnhtbCIpOwotCQkJCQlTdHJpbmcgYXhpczJUZW1wV2ViWE1MRmlsZSA9IEF4aXMyQ29yZVV0aWxzLmFkZEFub3RoZXJOb2RlVG9QYXRoKAotCQkJCQkJCWF4aXMyVGVtcFdlYkluZkZpbGUsCi0JCQkJCQkJQXhpczJDb25zdGFudHMuRklMRV9XRUJfWE1MKTsKLQotCQkJCQkvL0NvcHkgdGhlIHdlYmFwcCBjb250ZW50IAotCQkJCQlGaWxlVXRpbHMuY29weURpcmVjdG9yeShuZXcgRmlsZShheGlzMldlYmFwcExvY2F0aW9uKSwgdGVtcFdhckxvY2F0aW9uRmlsZSk7Ci0JCQkJCS8vLy9kZWxldGUgdGhlIGF4aXMyIHdlYi54bWwgRmlsZShEV1AgYWxyZWFkeSBoYXZlKQotCQkJCQluZXcgRmlsZShheGlzMlRlbXBXZWJCdWlsZEZpbGUpLmRlbGV0ZSgpOwotCQkJCQkvL2RlbGV0ZSB0aGUgd2ViLnhtbCBGaWxlCi0JCQkJCW5ldyBGaWxlKGF4aXMyVGVtcFdlYlhNTEZpbGUpLmRlbGV0ZSgpOwotCQkJCQkvL0NvcHkgbGlicyAKLQkJCQkJRmlsZVV0aWxzLmNvcHlEaXJlY3RvcnkobmV3IEZpbGUoYXhpczJMaWJGaWxlKSwKLQkJCQkJCQkJCQkJbmV3IEZpbGUoYXhpczJUZW1wV2ViSW5mTGliRmlsZSkpOwotCQkJCQkvL2NvcHkgY29uZi9heGlzMi54bWwKLQkJCQkJRmlsZVV0aWxzLmNvcHlEaXJlY3RvcnkobmV3IEZpbGUoYXhpczJDb25mRmlsZSksIAotCQkJCQkJCQkJCQluZXcgRmlsZShheGlzMlRlbXBXZWJJbmZDb25mRmlsZSkpOwotCQkJCQkvL0NvcHkgbW9kdWxlcyBhbmQgc2VydmljZXMgCQkJCQkKLQkJCQkJRmlsZVV0aWxzLmNvcHlEaXJlY3RvcnkobmV3IEZpbGUoYXhpczJSZXBvc2l0b3J5RmlsZSksIAotCQkJCQkJCQkJCQluZXcgRmlsZShheGlzMlRlbXBXZWJJbmZGaWxlKSk7Ci0JCQkJCS8vRmlsdGVyIG91dCB0aGUgc2VydmxldGFwaSBqYXJzCi0JCQkJCUZpbGVVdGlscy5maWx0ZXJPdXRSZXN0cmljdGVkRmlsZXMoYXhpczJUZW1wV2ViSW5mTGliRmlsZSwKLQkJCQkJCQlBeGlzMkNvbnN0YW50cy5GSUxFX1NFUlZMRVRfQVBJLCJqYXIiKTsKLQkJCQkJCi0JCQkJCWFscmVhZHlXYXJFeGlzdD0gdHJ1ZTsKLQkJCQl9Ci0KLQkJfQkKLQkJcmV0dXJuIHRlbXBXYXJMb2NhdGlvbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9mYWNldC91dGlscy9Db250ZW50Q29weVV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvZmFjZXQvdXRpbHMvQ29udGVudENvcHlVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODgxNGI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9mYWNldC91dGlscy9Db250ZW50Q29weVV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24sIFdTTzIgSW5jLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBXU08yIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogSUJNIENvcnBvcmF0aW9uLCAgV1NPMiBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiBXU08yIEluYy4gLSBpbml0aWFsIGV4dGVuZGVkIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIDIwMDcwMjEzICAxNjg3NjYgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgSW5pdGlhbCBjb2RlIHRvIGludHJvZHVzZSB0aGUgQXhpczIgCi0gKiAJCQkJCQkJCQkJICBmYWNldCB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjYKLSAqIDIwMDcwNDI2ICAgMTgzMDQ2IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgKLSAqIDIwMDcwNjA2ICAgMTc3NDIxIHNhbmRha2l0aEB3c28yLmNvbSAtIGZpeCB3ZWIueG1sIHdpcGVkIG91dCB3aGVuIEF4aXMyIGZhY2V0Ci0gKiAyMDA3MDgwOCAgIDE5NDkwNiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBGaXhpbmcgMTk0OTA2IFJ1bnRpbWUgbGliIGlzc3VlCi0gKiAyMDA3MDgxMyAgIDE5NjE3MyAgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgRml4IDE5NjE3MywgRFdQIGN1c3RvbSBsb2NhdGlvbiBmaXgKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuZmFjZXQudXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5wbHVnaW4ubWVzc2FnZXMuQXhpczJDb3JlVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29udGV4dC5SZXNvdXJjZUNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBDb250ZW50Q29weVV0aWxzIHsKLQotCXByaXZhdGUgc3RhdGljIElXb3Jrc3BhY2VSb290IHJvb3RfID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBJV29ya3NwYWNlIHdvcmtzcGFjZV8gPSBudWxsOwotCXByaXZhdGUgTGlzdCBmaWxlQW5kRGlyZWN0b3JpZXNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCUZpbGVJbnB1dFN0cmVhbSBmaW5TdHJlYW0gPSBudWxsOwkJCi0JcHJpdmF0ZSBMaXN0IGNoZWNrTGlzdCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIGNvcHkgdGhlIHNvdXJjZSBkaXJlY3RvcnkgaW50byB0aGUgZWNsaXBzZSB3b3Jrc3BhY2UgCi0JICogYWNjb3JkaW5nIHRvIHRoZSBFY2xpcHNlIEZyYW1ld29yayBBUEkKLQkgKiBAcGFyYW0gc291cmNlRGlyCi0JICogQHBhcmFtIGRlc3RpbmF0aW9uRGlyCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAcGFyYW0gc3RhdHVzSGFuZGxlcgotCSAqIEByZXR1cm4gSVN0YXR1cyA6IFN0YXR1cyBvZiB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIElTdGF0dXMgY29weURpcmVjdG9yeVJlY3Vyc2l2ZWx5SW50b1dvcmtzcGFjZShTdHJpbmcgc291cmNlRGlyLCAKLQkJCQkJCVN0cmluZyBkZXN0aW5hdGlvbkRpcixJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGJvb2xlYW4gaW5jbHVkZUxpc3RTZXQpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQkvL0ZpcnN0IG9mIGFsbCBjbGVhciB0aGUgY29udGVudCBpbiB0aGUgdGFyZ2V0ZWQgbGlzdAotCQlmaWxlQW5kRGlyZWN0b3JpZXNMaXN0LmNsZWFyKCk7Ci0JCUZpbGUgYXhpczJXZWJhcHBGb2xkZXIgPSBuZXcgRmlsZShzb3VyY2VEaXIpOwotCQlpZiAoaW5jbHVkZUxpc3RTZXQpIHsKLQkJCXZpc2l0QWxsRGlyc0FuZEZpbGVzV2l0aEluY2x1ZGVMaXN0KGF4aXMyV2ViYXBwRm9sZGVyLGNoZWNrTGlzdCk7Ci0JCX1lbHNlewotCQkJdmlzaXRBbGxEaXJzQW5kRmlsZXNXaXRoSWdub3JlTGlzdChheGlzMldlYmFwcEZvbGRlcixjaGVja0xpc3QpOwotCQl9Ci0JCQotCQlMaXN0IGRlcGxveUZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlkZXBsb3lGaWxlcz0gZmlsZUFuZERpcmVjdG9yaWVzTGlzdDsKLQotCQl0cnkgewotCi0JCQkvL0ltcG9ydCB0aGUgYXhpczIgZGVwZW5kZW5jeSBwbHVnaW4gYWNjb3JkaW5nIHRvIHRoZSBSZXNvdXJjZXMgQVBJIG9mIGVjbGlwc2UgCi0JCQlSZXNvdXJjZUNvbnRleHQgY29udGV4dCA9IFdlYlNlcnZpY2VQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRSZXNvdXJjZUNvbnRleHQoKTsJCi0KLQkJCUlQYXRoIG91dHB1dFBhdGggPSBuZXcgUGF0aCAoZGVzdGluYXRpb25EaXIpOwotCi0JCQlTdHJpbmcgZmlsZU5hbWU7Ci0JCQlJUGF0aCB0YXJnZXRQYXRoPW51bGw7Ci0JCQlib29sZWFuIGlzRGlyZWN0b3J5ID0gZmFsc2U7Ci0KLQkJCVN0cmluZyBkZXBsb3lGaWxlOwotCQkJSXRlcmF0b3IgaXRlcmF0b3I7Ci0KLQkJCVN0cmluZyB0ZW1wT3V0cHV0RGlyID0gYXhpczJXZWJhcHBGb2xkZXIudG9TdHJpbmcoKTsKLQkJCWl0ZXJhdG9yID0gZGVwbG95RmlsZXMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlkZXBsb3lGaWxlID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCQkJCUZpbGUgc291cmNlID0gbmV3IEZpbGUoZGVwbG95RmlsZSk7Ci0JCQkJaWYgKHNvdXJjZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJCWlzRGlyZWN0b3J5ID10cnVlOwotCQkJCX1lbHNlewotCQkJCQlpc0RpcmVjdG9yeT1mYWxzZTsKLQkJCQkJZmluU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShzb3VyY2UpOwotCQkJCX0KLQotCQkJCWlmIChkZXBsb3lGaWxlLnN0YXJ0c1dpdGgodGVtcE91dHB1dERpcikpIHsKLQkJCQkJZmlsZU5hbWUgPSBkZXBsb3lGaWxlLnN1YnN0cmluZyh0ZW1wT3V0cHV0RGlyLmxlbmd0aCgpKTsKLQkJCQkJdGFyZ2V0UGF0aCA9IG91dHB1dFBhdGguYXBwZW5kKGZpbGVOYW1lKS5tYWtlQWJzb2x1dGUoKTsKLQkJCQkJaWYgKGlzRGlyZWN0b3J5KXsKLQkJCQkJCW1ha2VGb2xkZXJQYXRoQXRMb2NhdGlvbihjb250ZXh0LCAgCi0JCQkJCQkJCXRhcmdldFBhdGgsCi0JCQkJCQkJCW1vbml0b3IpOwotCQkJCQl9ZWxzZXsKLQkJCQkJCWlmIChmaW5TdHJlYW0gIT0gbnVsbCkgewotCQkJCQkJCWNyZWF0ZUZpbGVBdExvY2F0aW9uKGNvbnRleHQsICAKLQkJCQkJCQkJCXRhcmdldFBhdGgsCi0JCQkJCQkJCQlmaW5TdHJlYW0sCi0JCQkJCQkJCQltb25pdG9yKTsKLQkJCQkJCX0KLQkJCQkJCWZpblN0cmVhbS5jbG9zZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlzdGF0dXMgPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cygKLQkJCQkJTkxTLmJpbmQoQXhpczJDb3JlVUlNZXNzYWdlcy5FUlJPUl9JTlZBTElEX0ZJTEVfUkVBRF9XUklURUwsCi0JCQkJCQkJIG5ldyBTdHJpbmdbXXtlLmdldExvY2FsaXplZE1lc3NhZ2UoKX0pLCBlKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlzdGF0dXMgPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cygKLQkJCQkJTkxTLmJpbmQoQXhpczJDb3JlVUlNZXNzYWdlcy5FUlJPUl9JTlZBTElEX0ZJTEVfUkVBRF9XUklURUwsCi0JCQkJCQkJIG5ldyBTdHJpbmdbXXtlLmdldExvY2FsaXplZE1lc3NhZ2UoKX0pLCBlKTsKLQkJfQotCi0JCXJldHVybiBzdGF0dXM7Ci0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdXBkYXRlQ2hlY2tMaXN0KExpc3QgbGlzdCl7Ci0JCWNoZWNrTGlzdCA9IGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogTG9hZCB0aGUgbGlzdCB3aXRoIGRpcmVjdG9yeSBjb250ZW50cyAoZmlsZXMvZm9sZGVycykgZXhjbHVkaW5nIHRoZSBpZ25vcmUgbGlzdAotCSAqIEBwYXJhbSBkaXIKLQkgKiBAcGFyYW0gaWdub3JlTGlzdAotCSAqLwotCXByaXZhdGUgdm9pZCB2aXNpdEFsbERpcnNBbmRGaWxlc1dpdGhJZ25vcmVMaXN0KEZpbGUgZGlyLCBMaXN0IGlnbm9yZUxpc3QpIHsKLQkJaWYoIWNoZWNrQ2hlY2tMaXN0SGl0KGRpcixpZ25vcmVMaXN0KSl7Ci0JCQlmaWxlQW5kRGlyZWN0b3JpZXNMaXN0LmFkZChkaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJaWYgKGRpci5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJU3RyaW5nW10gY2hpbGRyZW4gPSBkaXIubGlzdCgpOwotCQkJCWZvciAoaW50IGk9MDsgaTxjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCQl2aXNpdEFsbERpcnNBbmRGaWxlc1dpdGhJZ25vcmVMaXN0KG5ldyBGaWxlKGRpciwgY2hpbGRyZW5baV0pLGlnbm9yZUxpc3QpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBMb2FkIHRoZSBsaXN0IHdpdGggZGlyZWN0b3J5IGNvbnRlbnRzIChmaWxlcy9mb2xkZXJzKSBvbmx5IG1hdGNoIHdpdGggdGhlIGluY2x1ZGUgbGlzdCAKLQkgKiBAcGFyYW0gZGlyCi0JICogQHBhcmFtIGluY2x1ZGVMaXN0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHZpc2l0QWxsRGlyc0FuZEZpbGVzV2l0aEluY2x1ZGVMaXN0KEZpbGUgZGlyLCBMaXN0IGluY2x1ZGVMaXN0KSB7Ci0JCWlmKGNoZWNrQ2hlY2tMaXN0SGl0KGRpcixpbmNsdWRlTGlzdCkpewotCQkJZmlsZUFuZERpcmVjdG9yaWVzTGlzdC5hZGQoZGlyLmdldEFic29sdXRlUGF0aCgpKTsKLQkJfQotCQlpZiAoZGlyLmlzRGlyZWN0b3J5KCkpIHsKLQkJCVN0cmluZ1tdIGNoaWxkcmVuID0gZGlyLmxpc3QoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCXZpc2l0QWxsRGlyc0FuZEZpbGVzV2l0aEluY2x1ZGVMaXN0KG5ldyBGaWxlKGRpciwgY2hpbGRyZW5baV0pLGluY2x1ZGVMaXN0KTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDaGVjayB0aGUgPGNvZGU+ZmlsZTwvY29kZT4gcGFzcyBpbiwgbWF0Y2hlcyBhIGZpbGUgaW4gdGhlIDxjb2RlPmxpc3Q8L2NvZGU+Ci0JICogQHBhcmFtIGZpbGUgCi0JICogQHBhcmFtIGxpc3QKLQkgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2hlY2sKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY2hlY2tDaGVja0xpc3RIaXQoRmlsZSBmaWxlLCBMaXN0IGxpc3QpewotCQlpZihsaXN0ICE9IG51bGwpewotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJU3RyaW5nIGVsZW0gPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYoZWxlbS5lcXVhbHMoZmlsZS5nZXRBYnNvbHV0ZUZpbGUoKS50b1N0cmluZygpKSl7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIElGb2xkZXIgbWFrZUZvbGRlciAoCi0JCSAgICBSZXNvdXJjZUNvbnRleHQgIHJlc291cmNlQ29udGV4dCwKLQkJICAgIElDb250YWluZXIgICAgICAgcGFyZW50LAotCQkgICAgU3RyaW5nICAgICAgICAgICBmb2xkZXJOYW1lLAotCQkgICAgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IgKQotCQkgIAotCQkgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JCSAgewotCQkgICAgSVJlc291cmNlIGNoaWxkICA9IHBhcmVudC5maW5kTWVtYmVyKGZvbGRlck5hbWUpOwotCQkgICAgaWYoIGNoaWxkID09IG51bGwgKQotCQkgICAgewotCQkgICAgICBJRm9sZGVyIGZvbGRlciA9IHBhcmVudC5nZXRGb2xkZXIobmV3IFBhdGgoZm9sZGVyTmFtZSkpOwotCQkgICAgICBmb2xkZXIuY3JlYXRlKHRydWUsdHJ1ZSxudWxsKTsKLQkJICAgICAgcmV0dXJuIGZvbGRlcjsKLQkJICAgIH0KLQkJICAgIGVsc2UgaWYoIGNoaWxkLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSICkKLQkJICAgIHsKLQkJICAgICAgcmV0dXJuIChJRm9sZGVyKWNoaWxkOwotCQkgICAgfQotCQkgICAgZWxzZQotCQkgICAgewotCQkgICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbigKLQkJICAgICAgICBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCAKLQkJICAgICAgICAgICAgICAgICAgICAiUmVzb3VyY2VVdGlscyIsCi0JCSAgICAgICAgICAgICAgICAgICAgMCwgCi0JCSAgICAgICAgICAgICAgICAgICAgTkxTLmJpbmQoIkVSUk9SIiwvL0Vudmlyb25tZW50TWVzc2FnZXMuTVNHX0VSUk9SX1JFU09VUkNFX05PVF9GT0xERVIsCi0JCQkJCQkJICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117IHBhcmVudC5nZXRGdWxsUGF0aCgpLmFwcGVuZChmb2xkZXJOYW1lKS50b1N0cmluZygpIH0pLAotCQkJCQludWxsICkgKTsKLQkJICAgIH0KLQkJICB9Ci0KLQkKLQlwdWJsaWMgc3RhdGljIElDb250YWluZXIgbWFrZUZvbGRlclBhdGhBdExvY2F0aW9uICgKLQkJCSAgIFJlc291cmNlQ29udGV4dCAgcmVzb3VyY2VDb250ZXh0LAotCQkJICAgSUNvbnRhaW5lciAgICAgICByZXNvdXJjZSwKLQkJCSAgIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yICkKLQkJCSAKLQkJCSAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JCQkgICB7Ci0JCQkJIGlmIChyZXNvdXJjZS5leGlzdHMoKSkKLQkJCQkgewotCQkJCQkgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUNvbnRhaW5lcikKLQkJCQkJIHsKLQkJCQkJCSByZXR1cm4gKElDb250YWluZXIpIHJlc291cmNlOwotCQkJCQkgfQotCQkJCQkgZWxzZQotCQkJCQkgewotCQkJCQkJIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKAotCQkJCQkJCQkgbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgCi0JCQkJCQkJCQkJICJSZXNvdXJjZVV0aWxzIiwKLQkJCQkJCQkJCQkgMCwgCi0JCQkJCQkJCQkJIE5MUy5iaW5kKCJFUlJPUiIsCi0JCQkJCQkJCQkJCQkgbmV3IE9iamVjdFtdeyByZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkgfSksCi0JCQkJCQkJCQkJCQkgbnVsbCApICk7Ci0JCQkJCSB9Ci0JCQkJIH0KLQkJCQkgZWxzZQotCQkJCSB7Ci0JCQkJCSBJQ29udGFpbmVyIHBhcmVudCA9IG1ha2VGb2xkZXJQYXRoQXRMb2NhdGlvbihyZXNvdXJjZUNvbnRleHQsIAotCQkJCQkJCSAJCQlyZXNvdXJjZS5nZXRQYXJlbnQoKSwgCi0JCQkJCQkJIAkJCXByb2dyZXNzTW9uaXRvciApOwotCQkJCQkgU3RyaW5nIGZvbGRlck5hbWUgPSByZXNvdXJjZS5nZXROYW1lKCk7Ci0JCQkJCSAKLQkJCQkJIHJldHVybiBtYWtlRm9sZGVyKHJlc291cmNlQ29udGV4dCwgcGFyZW50LCBmb2xkZXJOYW1lLCBwcm9ncmVzc01vbml0b3IgICk7Ci0JCQkJIH0KLQkJCSB9Ci0JCi0JCi0JIC8qKgotCSAgKiBDcmVhdGVzIGEgcGF0aCBvZiBmb2xkZXJzLgotCSAgKiBEbyBub3QgY2FsbCB3aXRoIGFuIGFic29sdXRlUGF0aCBvZiBsZXNzIHRoYW4gb25lIHNlZ21lbnQuCi0JICAqIEBwYXJhbSByZXNvdXJjZUNvbnRleHQgdGhlIHJlc291cmNlIGNvbnRleHQgZm9yIG1ha2luZyBmb2xkZXJzLgotCSAgKiBAcGFyYW0gYWJzb2x1dGVQYXRoIHRoZSBwYXRoIG9mIGZvbGRlcnMgdGhhdCB3aWxsIGJlIGNyZWF0ZWQuCi0JICAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IgdGhlIHByb2dyZXNzIG1vbml0b3IgdG8gYmUgdXNlZC4KLQkgICogQHBhcmFtIHN0YXR1c0hhbmRsZXIgdGhlIHN0YXR1cyBoYW5kbGVyLgotCSAgKiBAcmV0dXJuIHJldHVybnMgdGhlIElDb250YWluZXIgb2YgdGhlIGNyZWF0ZWQgZm9sZGVyLgotCSAgKi8KLQkgcHVibGljIHN0YXRpYyBJQ29udGFpbmVyIG1ha2VGb2xkZXJQYXRoQXRMb2NhdGlvbiAoCi0JICAgUmVzb3VyY2VDb250ZXh0ICByZXNvdXJjZUNvbnRleHQsCi0JICAgSVBhdGggICAgICAgICAgICBhYnNvbHV0ZVBhdGgsCi0JICAgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IgKQotCSAKLQkgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSB7Ci0JIAlyZXR1cm4gbWFrZUZvbGRlclBhdGhBdExvY2F0aW9uKHJlc291cmNlQ29udGV4dCwKLSAJCQlnZXRXb3Jrc3BhY2VSb290KCkuZ2V0Q29udGFpbmVyRm9yTG9jYXRpb24oYWJzb2x1dGVQYXRoKSwKLQkgCQkvL2dldFdvcmtzcGFjZVJvb3QoKS5nZXRDb250YWluZXJGb3JMb2NhdGlvbihuZXcgUGF0aCgiL2hvbWUvc2FuZGFraXRoL3RlbXAvVGVzdC9UZXN0L1dlYkNvbnRlbnQiKSksCi0JIAkJLy8iL2hvbWUvc2FuZGFraXRoL0VjbGlwc2VfV29ya3NwYWNlL3dvcmtzcGFjZS90ZXN0VGhpcyIKLQkgCQlwcm9ncmVzc01vbml0b3IpOwotCSB9Ci0JIAotCSAKLQkgcHVibGljIHN0YXRpYyBJV29ya3NwYWNlUm9vdCBnZXRXb3Jrc3BhY2VSb290ICgpCi0JICB7Ci0JICAgIGlmIChyb290XyA9PSBudWxsKQotCSAgICB7Ci0JICAgICAgcm9vdF8gPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCSAgICB9Ci0JICAgIHJldHVybiByb290XzsKLQkgIH0KLQkKLQkgIHB1YmxpYyBzdGF0aWMgSUZpbGUgY3JlYXRlRmlsZUF0TG9jYXRpb24gKAotCQkJICAgICBSZXNvdXJjZUNvbnRleHQgcmVzb3VyY2VDb250ZXh0LAotCQkJICAgICBJUGF0aCAgICAgICAgICAgYWJzb2x1dGVQYXRoLAotCQkJICAgICBJbnB1dFN0cmVhbSAgICAgaW5wdXRTdHJlYW0sCi0JCQkgICAgIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yICkKLQotCQkJICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiAKLQkJCSAgIHsgICAgCi0JCQkgICAgIGlmICghYWJzb2x1dGVQYXRoLmlzQWJzb2x1dGUoKSkKLQkJCSAgICAgewotCQkJICAgICAgIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgIlJlc291cmNlVXRpbHMiLDAsCi0JCQkgICAgCQkgICBOTFMuYmluZCgiRVJST1IiLC8vRW52aXJvbm1lbnRNZXNzYWdlcy5NU0dfRVJST1JfUEFUSF9OT1RfQUJTT0xVVEUsCi0JCQkgICAgCQkgICBuZXcgT2JqZWN0W10ge2Fic29sdXRlUGF0aC50b1N0cmluZygpfSksbnVsbCkpOwotCQkJICAgICB9Ci0JCQkgICAgIGlmIChhYnNvbHV0ZVBhdGguc2VnbWVudENvdW50KCkgPCAxKQotCQkJICAgICB7Ci0JCQkgICAgICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCJSZXNvdXJjZVV0aWxzIiwwLAotCQkJICAgIAkJICAgTkxTLmJpbmQoIkVSUk9SIiwvL0Vudmlyb25tZW50TWVzc2FnZXMuTVNHX0VSUk9SX1BBVEhfRU1QVFksCi0JCQkgICAgCQkgICBuZXcgT2JqZWN0W10ge2Fic29sdXRlUGF0aC50b1N0cmluZygpfSksbnVsbCkpOwotCQkJICAgICB9Ci0JCQkgICAgIGlmIChhYnNvbHV0ZVBhdGguc2VnbWVudENvdW50KCkgPCAyKQotCQkJICAgICB7Ci0JCQkgICAgICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCJSZXNvdXJjZVV0aWxzIiwwLAotCQkJICAgIAkJICAgTkxTLmJpbmQoIkVSUk9SIiwvL0Vudmlyb25tZW50TWVzc2FnZXMuTVNHX0VSUk9SX1BBVEhfTk9UX0ZPTERFUiwKLQkJCSAgICAJCSAgIG5ldyBPYmplY3RbXSB7YWJzb2x1dGVQYXRoLnRvU3RyaW5nKCl9KSxudWxsKSk7Ci0JCQkgICAgIH0KLQkJCSAgICAgSUNvbnRhaW5lciBwYXJlbnQgICA9IG1ha2VGb2xkZXJQYXRoQXRMb2NhdGlvbihyZXNvdXJjZUNvbnRleHQsIAotCQkJICAgIAkJIAkJCQlhYnNvbHV0ZVBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLCBwcm9ncmVzc01vbml0b3IpOwotCQkJICAgICBTdHJpbmcgICAgIGZpbGVOYW1lID0gYWJzb2x1dGVQYXRoLmxhc3RTZWdtZW50KCk7Ci0JCQkgICAgIAotCQkJICAgICByZXR1cm4gbWFrZUZpbGUocmVzb3VyY2VDb250ZXh0LCBwYXJlbnQsIGZpbGVOYW1lLCBpbnB1dFN0cmVhbSwgcHJvZ3Jlc3NNb25pdG9yKTsKLQkJCSAgIH0KLQkKLQkKLQkgIHByaXZhdGUgc3RhdGljIElGaWxlIG1ha2VGaWxlICgKLQkJCSAgICBSZXNvdXJjZUNvbnRleHQgIHJlc291cmNlQ29udGV4dCwKLQkJCSAgICBJQ29udGFpbmVyICAgICAgIHBhcmVudCwKLQkJCSAgICBTdHJpbmcgICAgICAgICAgIGZpbGVOYW1lLAotCQkJICAgIElucHV0U3RyZWFtICAgICAgaW5wdXRTdHJlYW0sCi0JCQkgICAgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IgKQotCQkJIAotCQkJICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JCQkgIHsKLQkJCSAgICBJUmVzb3VyY2UgY2hpbGQgID0gcGFyZW50LmZpbmRNZW1iZXIoZmlsZU5hbWUpOwotCQkJICAgIAotCQkJICAgIGlmKCBjaGlsZCAhPSBudWxsICkKLQkJCSAgICB7Ci0JCQkgICAgICBpZiggY2hpbGQuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFICkKLQkJCSAgICAgIHsKLQkJCSAgICAKLQkJCSAgICAgICAgLy9XZSBoYXZlIHBlcm1pc3Npb24gdG8gb3ZlcndyaXRlIHNvIGNoZWNrIGlmIGZpbGUgaXMgcmVhZC1vbmx5Ci0JCQkgICAgICAgIGlmKGNoaWxkLmdldFJlc291cmNlQXR0cmlidXRlcygpIT1udWxsICYmIAotCQkJICAgICAgICAJCQkJCQljaGlsZC5nZXRSZXNvdXJjZUF0dHJpYnV0ZXMoKS5pc1JlYWRPbmx5KCkgKQotCQkJICAgICAgICB7Ci0JCQkgICAgICAgICAgSUZpbGVbXSBmaWxlcyA9IG5ldyBJRmlsZVsxXTsKLQkJCSAgICAgICAgICBmaWxlc1swXSA9IChJRmlsZSljaGlsZDsKLQkJCSAgICAgICAgfQotCi0JCQkgICAgICAgIC8vQ2hhbmdlIHRoZSBjb250ZW50cyBvZiB0aGUgZXhpc3RpbmcgZmlsZS4KLQkJCSAgICAgICAgSUZpbGUgZmlsZSA9IHBhcmVudC5nZXRGaWxlKCBuZXcgUGF0aChmaWxlTmFtZSkgKTsKLQkJCSAgICAgICAgZmlsZS5zZXRDb250ZW50cyggaW5wdXRTdHJlYW0sIHRydWUsIHRydWUsIG51bGwgKTsKLQkJCSAgICAgICAgCi0JCQkgICAgICAgIHJldHVybiBmaWxlOwotCQkJICAgICAgCi0JCQkgICAgICB9Ci0JCQkgICAgICBlbHNlCi0JCQkgICAgICB7Ci0JCQkgICAgICAgIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKCAKLQkJCSAgICAgICAgICBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLAotCQkJICAgICAgICAgICAgICAgICAgICAgICJSZXNvdXJjZVV0aWxzIiwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAwLCAKLQkJCSAgICAgICAgICAgICAgICAgICAgICBOTFMuYmluZCgiRVJST1IiLAotCQkJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtwYXJlbnQuZ2V0RnVsbFBhdGgoKS5hcHBlbmQoZmlsZU5hbWUpfSksCi0JCQkJCQkJCSAgbnVsbCApICk7Ci0JCQkgICAgICB9Ci0JCQkgICAgfQotCQkJICAgIGVsc2UKLQkJCSAgICB7Ci0JCQkgICAgICAvL0NyZWF0ZSBhIG5ldyBmaWxlLgotCQkJICAgICAgSUZpbGUgZmlsZSA9IHBhcmVudC5nZXRGaWxlKCBuZXcgUGF0aChmaWxlTmFtZSkgKTsKLQkJCSAgICAgIGZpbGUuY3JlYXRlKCBpbnB1dFN0cmVhbSwgdHJ1ZSwgbnVsbCk7Ci0JCQkgICAgICAKLQkJCSAgICAgIHJldHVybiBmaWxlOwotCQkJICAgIH0KLQkJCSAgfQotCSAgCi0JICBwdWJsaWMgc3RhdGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlICgpCi0JICB7Ci0JICAgIGlmICh3b3Jrc3BhY2VfID09IG51bGwpCi0JICAgIHsKLQkgICAgICBpZiAocm9vdF8gPT0gbnVsbCkKLQkgICAgICB7Ci0JICAgICAgICByb290XyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JICAgICAgfQotCSAgICAgIAotCSAgICAgIHdvcmtzcGFjZV8gPSByb290Xy5nZXRXb3Jrc3BhY2UoKTsKLQkgICAgfQotCSAgICAKLQkgICAgcmV0dXJuIHdvcmtzcGFjZV87Ci0JICB9Ci0JICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0ZTg2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjBhNWI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotYnVpbGQueG1sCi1qYXZhQ29tcGlsZXIuLi5hcmdzCi1AZG90Ci1vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZV8xLjAuMTAyLjIwMDgwNDAyMDIwNC5qYXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWMwZDY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzU1MmFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotI1N1biBNYXkgMDYgMTc6MzM6MzggTEtUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMjJiYjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jV2VkIEZlYiAyMSAxMDo0OTowNiBMS1QgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT1kZWZhdWx0Ci1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/PlxuPHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdmYmNjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJVBMVUdJTl9OQU1FCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZQotQnVuZGxlLVZlcnNpb246IDEuMC4xMDIucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS5wbHVnaW4uV2ViU2VydmljZUF4aXMyQ3JlYXRpb25Db3JlUGx1Z2luCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcywKLSBvcmcuZWNsaXBzZS53c3Qud3MsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuaW5mb3BvcCwKLSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQsCi0gb3JnLmVjbGlwc2UuanN0LndzLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlLAotIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLAotIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLAotIG9yZy5hcGFjaGUuYW50Ci1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS5jb21tYW5kLAotIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLm1lc3NhZ2VzLAotIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLnBsdWdpbiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS51dGlscwotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1CdW5kbGUtVmVuZG9yOiAlUExVR0lOX1BST1ZJREVSCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNzNiZGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0OGVkOWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgV1NPMiBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0jIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIDIwMDcwNTA3ICAgMTg1Njg2IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQzNDZmOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgV1NPMiBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0jIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIDIwMDcwNDI4ICAgMTY4NzYyIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgY29kZSB0byBpbnRyb2R1c2UgdGhlIAotIyAJCQkJCQkJCQkJIEF4aXMyIHJ1bnRpbWUgdG8gdGhlIGZyYW1ld29yayBmb3IgMTY4NzYyCi0jIDIwMDcwNTAxICAgMTg0NjE3IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIFByb3ZpZGUgcGx1Z2luIGRldGFpbHMKLSMgMjAwNzA1MDcgICAxODU2ODYgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jCi0jIE1lc3NhZ2VzIGluIHBsdWdpbi54bWwuCi0jCi1QTFVHSU5fTkFNRT1XZWJzZXJ2aWNlIEF4aXMyIENyZWF0aW9uIENvcmUgUGx1Zy1pbgotUExVR0lOX1BST1ZJREVSPVdTTzIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jcmVhdGlvbi9jb3JlL2NvbW1hbmQvQXhpczJCVUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jcmVhdGlvbi9jb3JlL2NvbW1hbmQvQXhpczJCVUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ1ZmZlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY3JlYXRpb24vY29yZS9jb21tYW5kL0F4aXMyQlVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IFdTTzIgSW5jLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBXU08yIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzAxMTAgICAxNjg3NjIgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgSW5pdGlhbCBjb2RlIHRvIGludHJvZHVzZSB0aGUgQXhpczIgcnVudGltZSB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS5jb21tYW5kOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLmRhdGEuRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLm1lc3NhZ2VzLkF4aXMyQ3JlYXRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBBeGlzMkJVQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIAotewotICBwcml2YXRlIERhdGFNb2RlbCBtb2RlbDsKLSAgCi0gIHB1YmxpYyBBeGlzMkJVQ29tbWFuZCggRGF0YU1vZGVsIG1vZGVsICkKLSAgewotICAgIHRoaXMubW9kZWwgPSBtb2RlbDsgIAotICB9Ci0gIAotICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgYWRhcHRhYmxlICkgCi0gIHsKLSAgICBJU3RhdHVzIHN0YXR1cyA7ICAKLSAgICAvLyBDaGVjayBmb3IgdGhlIG5lc3Nlc2FyeSBkYXRhIGFyZSBhdmFpbGFibGUgZm9yIHRoZSBzY2VuYXJpbyB0byBiZWdpbgotICAgIGlmIChtb2RlbC5nZXRTZXJ2aWNlQ2xhc3MoKSA9PSBudWxsKXsKLQkJc3RhdHVzID0gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoQXhpczJDcmVhdGlvblVJTWVzc2FnZXMuRVJST1JfSU5WQUxJRF9TRVJWSUNFX0NSRUFUSU9OKTsKLSAgICB9ZWxzZSB7Ci0JCXN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7IC8vIE9rIHRvIHByb2NlZWQgCi0JfQotICAgIHJldHVybiBzdGF0dXM7ICAgICAgCQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY3JlYXRpb24vY29yZS9jb21tYW5kL0F4aXMyQlVTZXJ2aWNlQ3JlYXRpb25Db21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY3JlYXRpb24vY29yZS9jb21tYW5kL0F4aXMyQlVTZXJ2aWNlQ3JlYXRpb25Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzZWUzOTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NyZWF0aW9uL2NvcmUvY29tbWFuZC9BeGlzMkJVU2VydmljZUNyZWF0aW9uQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDExMCAgIDE2ODc2MiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbml0aWFsIGNvZGUgdG8gaW50cm9kdXNlIHRoZSBBeGlzMiBydW50aW1lIHRvIHRoZSBmcmFtZXdvcmsgZm9yIDE2ODc2MgotICogMjAwNzA0MjYgICAxODMwNDYgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aAotICogMjAwNzA2MjUgICAxOTI1MjIgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgZml4IHRoZSBidWlsZCBwYXRoIHByb2JsZW0KLSAqIDIwMDcwODEzICAgMTk2MTczICBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBGaXggMTk2MTczLCBEV1AgY3VzdG9tIGxvY2F0aW9uIGZpeAotICogMjAwNzA4MjQgICAyMDA1MTUgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgTk9OLU5MUyBtb3ZlIHRvIHNlcGVyYXRlIGZpbGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS5jb21tYW5kOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUuY29uc3RhbnQuQXhpczJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUudXRpbHMuRmFjZXRDb250YWluZXJVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS51dGlscy5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUuZGF0YS5EYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUubWVzc2FnZXMuQXhpczJDcmVhdGlvblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUudXRpbHMuQ29tbW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUudXRpbHMuU2VydmljZVhNTENyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1c1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuSVdlYlNlcnZpY2U7Ci0KLXB1YmxpYyBjbGFzcyBBeGlzMkJVU2VydmljZUNyZWF0aW9uQ29tbWFuZCBleHRlbmRzCi0JCUFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKLQkKLQkgIAlwcml2YXRlIERhdGFNb2RlbCBtb2RlbDsKLQkJcHJpdmF0ZSBJV2ViU2VydmljZSB3czsKLQkJcHJpdmF0ZSBTdHJpbmcgcHJvamVjdDsKLQotCSAgcHVibGljIEF4aXMyQlVTZXJ2aWNlQ3JlYXRpb25Db21tYW5kKCBEYXRhTW9kZWwgbW9kZWwsSVdlYlNlcnZpY2Ugd3MsIFN0cmluZyBwcm9qZWN0ICkKLQkgIHsKLQkgICAgdGhpcy5tb2RlbCA9IG1vZGVsOyAgCi0JICAgIHRoaXMud3M9d3M7Ci0JICAgIHRoaXMucHJvamVjdD0gcHJvamVjdDsKLQkgIH0KLQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pCi0JCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOyAgCi0JCUlFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9IGdldEVudmlyb25tZW50KCk7Ci0JCS8vVGhlIGZ1bGwgUXVsYWxpZmllZCBTZXJ2aWNlIENsYXNzCi0JCVN0cmluZyBzZXJ2aWNlQ2xhc3MgPSB3cy5nZXRXZWJTZXJ2aWNlSW5mbygpLmdldEltcGxVUkwoKTsgCi0JCXRyeSB7Ci0JCQkKLQkJCVN0cmluZyB3b3Jrc3BhY2VEaXJlY3RvcnkgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkKLQkJCQkJCQkJCQkJCQkJLmdldFJvb3QoKS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKTsKLQkJCVN0cmluZyBtYXRhZGF0YURpciA9IEZpbGVVdGlscy5hZGRBbm90aGVyTm9kZVRvUGF0aCh3b3Jrc3BhY2VEaXJlY3RvcnksCi0JCQkJCUF4aXMyQ29uc3RhbnRzLkRJUl9ET1RfTUVUQURBVEEpOwotCQkgICAgU3RyaW5nIG1hdGFkYXRhUGx1Z2luc0RpciA9IEZpbGVVdGlscy5hZGRBbm90aGVyTm9kZVRvUGF0aChtYXRhZGF0YURpciwKLQkJICAgIAkJQXhpczJDb25zdGFudHMuRElSX0RPVF9QTFVHSU5TKTsKLQkJICAgIFN0cmluZyBtYXRhZGF0YUF4aXMyRGlyID0gRmlsZVV0aWxzLmFkZEFub3RoZXJOb2RlVG9QYXRoKG1hdGFkYXRhUGx1Z2luc0RpciwgCi0JCSAgICAJCUF4aXMyQ29uc3RhbnRzLkFYSVMyX1BST0pFQ1QpOwotCQkgICAgU3RyaW5nIHdlYnNlcnZpY2VzRGlyID0gRmlsZVV0aWxzLmFkZEFub3RoZXJOb2RlVG9QYXRoKG1hdGFkYXRhQXhpczJEaXIsCi0JCSAgICAJCUF4aXMyQ29uc3RhbnRzLkRJUl9XRUJTRVJWSUNFUyk7Ci0JCSAgICBtb2RlbC5zZXRQYXRoVG9XZWJTZXJ2aWNlc1RlbXBEaXIod2Vic2VydmljZXNEaXIpOwotCQkgICAgCi0JCQkvL0dldCB0aGUgU2VydmljZSBuYW1lIGZyb20gdGhlIGNsYXNzIG5hbWUKLQkJICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IENvbW1vblV0aWxzLmNsYXNzTmFtZUZyb21RdWFsaWZpZWROYW1lKHNlcnZpY2VDbGFzcyk7IAotCQkgICAgLy9TdHJpbmcgc2VydmljZVBhY2thZ2UgPSBDb21tb25VdGlscy5wYWNrYWdlTmFtZUZyb21RdWFsaWZpZWROYW1lKHNlcnZpY2VDbGFzcyk7IAotCQkJCi0JCQlTdHJpbmcgc2VydmljZXNEaXJlY3RvcnkgPSBGaWxlVXRpbHMuYWRkQW5vdGhlck5vZGVUb1BhdGgod2Vic2VydmljZXNEaXIsIHNlcnZpY2VOYW1lKTsKLQkJCVN0cmluZyBzZXJ2aWNlWE1MRGlyZWN0b3J5ID0gRmlsZVV0aWxzLmFkZEFub3RoZXJOb2RlVG9QYXRoKHNlcnZpY2VzRGlyZWN0b3J5LCAKLQkJCQkJQXhpczJDb25zdGFudHMuRElSX01FVEFfSU5GKTsKLQkJCQotCQkJLy9DcmVhdGUgdGhlIGRpcmVjdG9yaWVzCi0JCQkvL0NyZWF0ZSB0aGUgV2Vic2VydmljZXMgc3R1ZmYgb24gdGhlIHdvcmtzcGFjZSAubWF0YWRhdGEgZGlyZWN0b3J5ICAKLQkJICAgIEZpbGVVdGlscy5jcmVhdGVEaXJlY3RvcnlzKHNlcnZpY2VzRGlyZWN0b3J5KTsKLQkJICAgIEZpbGVVdGlscy5jcmVhdGVEaXJlY3RvcnlzKHNlcnZpY2VYTUxEaXJlY3RvcnkpOwkJICAgIAotCQkgICAgCi0JCSAgICAvL2NyZWF0ZSB0aGUgc2VydmljZXMueG1sIGZpbGUKLQkJICAgIEZpbGUgc2VydmljZVhNTEZpbGU7Ci0gICAgICAgICAgICBpZiAobW9kZWwuaXNHZW5lcmF0ZVNlcnZpY2VzWE1MKCkpewotCQkJICAgIFNlcnZpY2VYTUxDcmVhdG9yIHNlcnZpY2VYTUxDcmVhdG9yID0gbmV3IFNlcnZpY2VYTUxDcmVhdG9yKHNlcnZpY2VOYW1lLCAKLQkJCSAgICAJCQkJCQkJCQkJCQkJCQlzZXJ2aWNlQ2xhc3MsIAkKLQkJCSAgICAJCQkJCQkJCQkJCQkJCQludWxsKTsKLQkJCSAgICBzZXJ2aWNlWE1MRmlsZSA9IG5ldyBGaWxlKHNlcnZpY2VYTUxEaXJlY3RvcnkgKyBGaWxlLnNlcGFyYXRvciArIAotCQkJICAgIAkJQXhpczJDb25zdGFudHMuRklMRV9TRVJWSUNFU19YTUwpOwotCQkJICAgIEZpbGVXcml0ZXIgc2VydmljZVhNTEZpbGVXcml0ZXI7Ci0JCi0JCQkJc2VydmljZVhNTEZpbGVXcml0ZXIgPSBuZXcgRmlsZVdyaXRlcihzZXJ2aWNlWE1MRmlsZSwgZmFsc2UpOwotCSAgICAgICAgICAgIEJ1ZmZlcmVkV3JpdGVyIHdyaXRlciA9IG5ldyBCdWZmZXJlZFdyaXRlcihzZXJ2aWNlWE1MRmlsZVdyaXRlcikgOwotCSAgICAgICAgICAgIHdyaXRlci53cml0ZShzZXJ2aWNlWE1MQ3JlYXRvci50b1N0cmluZygpKSA7Ci0JICAgICAgICAgICAgd3JpdGVyLmNsb3NlKCkgOwotICAgICAgICAgICAgfWVsc2UgewotICAgICAgICAgICAgCVN0cmluZyBwYXRoVG9TZXJ2aWNlc1hNTCA9IG1vZGVsLmdldFBhdGhUb1NlcnZpY2VzWE1MKCk7Ci0gICAgICAgICAgICAJaWYgKHBhdGhUb1NlcnZpY2VzWE1MID09IG51bGwpewotICAgIAkJCQlzdGF0dXMgPSBTdGF0dXNVdGlscwotICAgIAkJCQkJLmVycm9yU3RhdHVzKEF4aXMyQ3JlYXRpb25VSU1lc3NhZ2VzLkVSUk9SX0lOVkFMSURfU0VSVklDRVNfWE1MKTsKLSAgICAJCQkJZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7IAotICAgICAgICAgICAgCX1lbHNlewotICAgICAgICAgICAgCQlzZXJ2aWNlWE1MRmlsZSA9IG5ldyBGaWxlKHBhdGhUb1NlcnZpY2VzWE1MKTsKLSAgICAgICAgICAgIAkJRmlsZSB0YXJnZXRTZXJ2aWNlc1hNTEZpbGUgPSBuZXcgRmlsZShzZXJ2aWNlWE1MRGlyZWN0b3J5ICsgRmlsZS5zZXBhcmF0b3IgKyAKLSAgICAgICAgICAgIAkJCQlBeGlzMkNvbnN0YW50cy5GSUxFX1NFUlZJQ0VTX1hNTCk7Ci0gICAgICAgICAgICAJCUZpbGVVdGlscy5jb3B5KHNlcnZpY2VYTUxGaWxlLCB0YXJnZXRTZXJ2aWNlc1hNTEZpbGUpOwotICAgICAgICAgICAgCX0KLSAgICAgICAgICAgIAkKLSAgICAgICAgICAgIH0KLQkgICAgICAgIAotICAgICAgICAgICAgLy9Db3B5IHRoZSBjbGFzc2VzIGRpcmVjdG9yeSB0byB0aGUgc2V2aWNlcyBkaXJlY3RvcnkKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc2VzRGlyZWN0b3J5ID0gbnVsbDsKLSAgICAJCUlQYXRoIHByb2plY3RSb290ID0gRmFjZXRDb250YWluZXJVdGlscy5nZXRQcm9qZWN0Um9vdChwcm9qZWN0KTsKLSAgICAJCUlQYXRoIGRlZmF1bHRDbGFzc2VzU3ViRGlyZWN0b3J5ID0gUmVzb3VyY2VVdGlscy5nZXRKYXZhT3V0cHV0TG9jYXRpb24oCi0gICAgICAgICAgICAJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0KSk7Ci0gICAgCQlJUGF0aCBkZWZhdWx0Q2xhc3Nlc1N1YkRpcmVjdG9yeVdpdGhvdXRQcm9qZWN0Um9vdCA9IFJlc291cmNlVXRpbHMuZ2V0SmF2YU91dHB1dExvY2F0aW9uKAotICAgICAgICAgICAgCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdCkpCi0gICAgICAgICAgICAJCS5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpLm1ha2VBYnNvbHV0ZSgpOwotICAgIAkJaWYocHJvamVjdFJvb3QudG9PU1N0cmluZygpLmNvbnRhaW5zKEZhY2V0Q29udGFpbmVyVXRpbHMuZ2V0V29ya3NwYWNlKCkudG9PU1N0cmluZygpKSl7Ci0gICAgCQkJY2xhc3Nlc0RpcmVjdG9yeSA9IEZhY2V0Q29udGFpbmVyVXRpbHMuZ2V0V29ya3NwYWNlKCkKLSAgICAJCQkJCQkuYXBwZW5kKGRlZmF1bHRDbGFzc2VzU3ViRGlyZWN0b3J5KS50b09TU3RyaW5nKCk7Ci0gICAgCQl9ZWxzZXsKLSAgICAJCQljbGFzc2VzRGlyZWN0b3J5ID0gcHJvamVjdFJvb3QKLSAgICAJCQkJCQkuYXBwZW5kKGRlZmF1bHRDbGFzc2VzU3ViRGlyZWN0b3J5V2l0aG91dFByb2plY3RSb290KS50b09TU3RyaW5nKCk7Ci0gICAgCQl9Ci0gICAgCQkKLSAgICAgICAgICAgIC8vVE9ETyBjb3B5IG9ubHkgdGhlIHJlbGV2ZW50IC5jbGFzc2VzIHRvIHRoZSBhYXIKLQkJCUZpbGVVdGlscy5jb3B5RGlyZWN0b3J5KG5ldyBGaWxlKGNsYXNzZXNEaXJlY3RvcnkpLAotCQkJCQkJCQkJbmV3IEZpbGUoc2VydmljZXNEaXJlY3RvcnkpKTsKLQkJCQotLy8JCQkvL0NyZWF0ZSB0aGUgLmFhciBmaWxlIAotLy8JCQlTdHJpbmcgYWFyRGlyU3RyaW5nID0gIEZpbGVVdGlscy5hZGRBbm90aGVyTm9kZVRvUGF0aCh3ZWJzZXJ2aWNlc0RpciwgCi0vLwkJCUF4aXMyQ3JlYXRpb25VSU1lc3NhZ2VzLkRJUl9BQVIpOwotLy8JCQlGaWxlIGFhckRpciA9IG5ldyBGaWxlKGFhckRpclN0cmluZyk7Ci0vLwkJCUZpbGVVdGlscy5jcmVhdGVEaXJlY3RvcnlzKGFhckRpclN0cmluZyk7Ci0vLwkJCUFBUkZpbGVXcml0ZXIgYWFyRmlsZVdyaXRlciA9IG5ldyBBQVJGaWxlV3JpdGVyKCk7Ci0vLwkJCUZpbGUgc2VydmlzZURpciA9IG5ldyBGaWxlKHNlcnZpY2VzRGlyZWN0b3J5KTsKLS8vCQkJYWFyRmlsZVdyaXRlci53cml0ZUFBUkZpbGUoYWFyRGlyLCBzZXJ2aWNlTmFtZSArIAotLy8JCQlBeGlzMkNyZWF0aW9uVUlNZXNzYWdlcy5GSUxFX0FBUiwgc2VydmlzZURpcik7Ci0JCQkKLQkJCS8vSW1wb3J0IGFsbCB0aGUgc3R1ZmYgZm9ybSB0aGUgLm1hdGFkYXRhIGRpcmVjdG9yeSB0byBpbnNpZGUgdGhlIGN1cnJlbnQgd2ViIHByb2plY3QKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlzdGF0dXMgPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cygKLQkJCQkJCU5MUy5iaW5kKEF4aXMyQ3JlYXRpb25VSU1lc3NhZ2VzLkVSUk9SX0lOVkFMSURfRklMRV9SRUFEX1dSSVRFTCwKLQkJCQkJCQkJbmV3IFN0cmluZ1tde2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpfSksIGUpOwotCQkJCWVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOyAKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJc3RhdHVzID0gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoCi0JCQkJCQlOTFMuYmluZChBeGlzMkNyZWF0aW9uVUlNZXNzYWdlcy5FUlJPUl9JTlZBTElEX1NFUlZJQ0VfQ1JFQVRJT04sCi0JCQkJCQkJCW5ldyBTdHJpbmdbXXtlLmdldExvY2FsaXplZE1lc3NhZ2UoKX0pLCBlKTsKLQkJCQllbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsgCi0JCQl9Ci0JCSAgICAKLQkJCi0JICAgIAotCSAgICByZXR1cm4gc3RhdHVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jcmVhdGlvbi9jb3JlL2NvbW1hbmQvQXhpczJCdWlsZFByb2plY3RDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY3JlYXRpb24vY29yZS9jb21tYW5kL0F4aXMyQnVpbGRQcm9qZWN0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjZkY2NkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jcmVhdGlvbi9jb3JlL2NvbW1hbmQvQXhpczJCdWlsZFByb2plY3RDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBXU08yIEluYy4gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogV1NPMiBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDcwMTEwICAgMTY4NzYyIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgY29kZSB0byBpbnRyb2R1c2UgdGhlIEF4aXMyIHJ1bnRpbWUgdG8gdGhlIGZyYW1ld29yayBmb3IgMTY4NzYyCi0gKiAyMDA3MDQyNiAgIDE4MzA0NiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoCi0gKiAyMDA3MDUwNyAgIDE4NTY4NiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUuY29tbWFuZDsKLQotLy9pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC52YWxpZGF0aW9uLlZhbGlkYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgQXhpczJCdWlsZFByb2plY3RDb21tYW5kIGV4dGVuZHMKLQkJQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gewotCQotLy8JICBwcml2YXRlIFZhbGlkYXRpb25NYW5hZ2VyIHZhbGlkYXRpb25NYW5hZ2VyOwotCSAgcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OwotCSAgcHJpdmF0ZSBib29sZWFuIGZvcmNlQnVpbGQ7Ci0KLQkgIC8qKgotCSAgICogRGVmYXVsdCBDVE9SOwotCSAgICovCi0JICBwdWJsaWMgQXhpczJCdWlsZFByb2plY3RDb21tYW5kKCl7Ci0JICB9Ci0JICAKLQkgIHB1YmxpYyBBeGlzMkJ1aWxkUHJvamVjdENvbW1hbmQoSVByb2plY3QgcHJvamVjdCl7Ci0JCSAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLQkgIH0KLQkgIAotCSAgcHVibGljIEF4aXMyQnVpbGRQcm9qZWN0Q29tbWFuZChJUHJvamVjdCBwcm9qZWN0LCBib29sZWFuIGZvcmNlQnVpbGQpewotCQkgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0JCSAgdGhpcy5mb3JjZUJ1aWxkID0gZm9yY2VCdWlsZDsKLQkgIH0KLQotCSAgLyoqCi0JICAgKiBFeGVjdXRlIHRoZSBjb21tYW5kCi0JICAgKi8KLQkgIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBhZGFwdGFibGUgKQotCSAgewotCSAgICB0cnkKLQkgICAgewotCSAgICAgIGlmIChmb3JjZUJ1aWxkKQotCSAgICAgICAgcHJvamVjdC5idWlsZChJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLklOQ1JFTUVOVEFMX0JVSUxELCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLS8vCSAgICAgIGVsc2UgaWYgKHZhbGlkYXRpb25NYW5hZ2VyID09IG51bGwpCi0vLwkgICAgICAgIHByb2plY3QuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5JTkNSRU1FTlRBTF9CVUlMRCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0vLwkgICAgICBlbHNlIGlmICh2YWxpZGF0aW9uTWFuYWdlci5nZXRXb3Jrc3BhY2VBdXRvQnVpbGRQcmVmZXJlbmNlKCkpCi0vLwkgICAgICAgIHByb2plY3QuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5JTkNSRU1FTlRBTF9CVUlMRCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JICAgIH0KLQkgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKLQkgICAgfQotCSAgICAKLQkgICAgdHJ5ewotCSAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwKLSAgCQkgIAkJbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7ICAgCi0JICAgIH0KLQkgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKXsKLQkgICAgICAvLyBjb250aW51ZSBleGVjdXRpb24KLQkgICAgfQotCSAgICBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gb2NlKXsKLQkgICAgICAvLyBjb250aW51ZSBleGVjdXRpb24KLQkgICAgfQotCSAgICAKLQkgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JICB9Ci0JICAvKioKLQkgICAqIEBwYXJhbSBmb3JjZUJ1aWxkIFRoZSBmb3JjZUJ1aWxkIHRvIHNldC4KLQkgICAqLwotCSAgcHVibGljIHZvaWQgc2V0Rm9yY2VCdWlsZChib29sZWFuIGZvcmNlQnVpbGQpIHsKLQkgICAgdGhpcy5mb3JjZUJ1aWxkID0gZm9yY2VCdWlsZDsKLQkgIH0KLQotCSAgLyoqCi0JICAgKiBAcGFyYW0gcHJvamVjdCBUaGUgcHJvamVjdCB0byBzZXQuCi0JICAgKi8KLQkgIHB1YmxpYyB2b2lkIHNldFByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCSAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotCSAgfQotCi0vLwkgIC8qKgotLy8JICAgKiBAcGFyYW0gdmFsaWRhdGlvbk1hbmFnZXIgVGhlIHZhbGlkYXRpb25NYW5hZ2VyIHRvIHNldC4KLS8vCSAgICovCi0vLwkgIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRpb25NYW5hZ2VyKFZhbGlkYXRpb25NYW5hZ2VyIHZhbGlkYXRpb25NYW5hZ2VyKSB7Ci0vLwkgICAgdGhpcy52YWxpZGF0aW9uTWFuYWdlciA9IHZhbGlkYXRpb25NYW5hZ2VyOwotLy8JICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jcmVhdGlvbi9jb3JlL2NvbW1hbmQvQXhpczJDaGVuZ2VCdWlsZFBhdGhDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY3JlYXRpb24vY29yZS9jb21tYW5kL0F4aXMyQ2hlbmdlQnVpbGRQYXRoQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmI1NDBhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jcmVhdGlvbi9jb3JlL2NvbW1hbmQvQXhpczJDaGVuZ2VCdWlsZFBhdGhDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IFdTTzIgSW5jLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBXU08yIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzAxMjUgIDE2ODc2MiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbml0aWFsIGNvZGUgdG8gaW50cm9kdXNlIHRoZSBBeGlzMiAKLSAqIAkJCQkJCQkJCQkgIHJ1bnRpbWUgdG8gdGhlIGZyYW1ld29yayBmb3IgMTY4NzYyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBBeGlzMkNoZW5nZUJ1aWxkUGF0aENvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiB7Ci0JCi0JcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OwotCXByaXZhdGUgU3RyaW5nIHNyY0RpcjsKLQlwcml2YXRlIFN0cmluZyBvdXREaXI7Ci0JCi0JcHVibGljIEF4aXMyQ2hlbmdlQnVpbGRQYXRoQ29tbWFuZChJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgc3JjRGlyLCBTdHJpbmcgb3V0RGlyKSB7Ci0JCXRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0JCXRoaXMuc3JjRGlyID0gc3JjRGlyOwotCQl0aGlzLm91dERpciA9IG91dERpcjsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQotCQkJCSAgIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkKLQkJSVBhdGggc3JjUGF0aCA9IG5ldyBQYXRoKHNyY0Rpcik7Ci0JCUlQYXRoIG91dFBhdGggPSBuZXcgUGF0aChvdXREaXIpOwotCQkKLQkJSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQlmaW5hbCBJSmF2YVByb2plY3QganByb2ogPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0gICAgICAgIGZpbmFsIElDbGFzc3BhdGhFbnRyeVtdIGNwID0ge0phdmFDb3JlLm5ld1NvdXJjZUVudHJ5KHNyY1BhdGgpfTsKLQotICAgICAgICB0cnkgewotCQkJanByb2ouc2V0UmF3Q2xhc3NwYXRoKGNwLCBvdXRQYXRoLCBudWxsKTsKLQkJCWpwcm9qLnNhdmUobnVsbCwgdHJ1ZSk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY3JlYXRpb24vY29yZS9jb21tYW5kL0F4aXMyQ2xlYW51cENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jcmVhdGlvbi9jb3JlL2NvbW1hbmQvQXhpczJDbGVhbnVwQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGJiODJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jcmVhdGlvbi9jb3JlL2NvbW1hbmQvQXhpczJDbGVhbnVwQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBXU08yIEluYy4gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogV1NPMiBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDcwMzE0ICAgMTY4NzYyIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgY29kZSB0byBpbnRyb2R1c2UgCi0gKiAJCQkJCQkJCQkJdGhlIEF4aXMyIHJ1bnRpbWUgdG8gdGhlIGZyYW1ld29yayBmb3IgMTY4NzYyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUuY29tbWFuZDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBBeGlzMkNsZWFudXBDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gCi17Ci0gIAotICBwdWJsaWMgQXhpczJDbGVhbnVwQ29tbWFuZCgpewotICB9Ci0gIAotICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgYWRhcHRhYmxlICkgCi0gIHsKLSAgICAvLyBDbGVhbnVwIHRoZSByZWZsZWN0aW9uIG92ZXIgaGVhZCBieSBpbmNyZWFzaW5nIHRoZSBwcmlvcml0eSB0byB0aGUgZ2FyYmFnZSB0aHJlYWQKLSAgICBTeXN0ZW0uZ2MoKTsKLSAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsgICAgICAJCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jcmVhdGlvbi9jb3JlL2NvbW1hbmQvQXhpczJEZWZhdWx0aW5nQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NyZWF0aW9uL2NvcmUvY29tbWFuZC9BeGlzMkRlZmF1bHRpbmdDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmZDViMjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NyZWF0aW9uL2NvcmUvY29tbWFuZC9BeGlzMkRlZmF1bHRpbmdDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBXU08yIEluYy4gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogV1NPMiBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDcwMjA2ICAgMTY4NzYyIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgY29kZSB0byBpbnRyb2R1c2UgdGhlIEF4aXMyIAotICogCQkJCQkJCQkJCSAgcnVudGltZSB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjIKLSAqIDIwMDcwNTA4ICAgMTc1MDMwIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIFdTREwgbm90IHBhc3NlZCB0byBBeGlzMiBjbGllbnQgZml4Ci0gKiAyMDA3MDYxMiAgIDE5MjA0NyBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCAxOTIwNDcKLSAqIDIwMDcwODI0ICAgMjAwNTE1IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIE5PTi1OTFMgbW92ZSB0byBzZXBlcmF0ZSBmaWxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUuY29tbWFuZDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS51dGlscy5EZWZhdWx0Q29kZWdlblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUuY29uc3RhbnQuQXhpczJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUuY29udGV4dC5TZXJ2aWNlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5wbHVnaW4ubWVzc2FnZXMuQXhpczJDb3JlVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS51dGlscy5BeGlzMkNvcmVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS51dGlscy5GYWNldENvbnRhaW5lclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLmRhdGEuRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLnV0aWxzLkNvbW1vblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LklXZWJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LldlYlNlcnZpY2VTY2VuYXJpbzsKLQotcHVibGljIGNsYXNzIEF4aXMyRGVmYXVsdGluZ0NvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiAKLXsKLQlwcml2YXRlIERhdGFNb2RlbCBtb2RlbDsKLQlwcml2YXRlIElXZWJTZXJ2aWNlIHdzOwotCXByaXZhdGUgaW50IHNjZW5hcmlvOwotCUlTdGF0dXMgc3RhdHVzOwotCi0JcHVibGljIEF4aXMyRGVmYXVsdGluZ0NvbW1hbmQoIERhdGFNb2RlbCBtb2RlbCAsSVdlYlNlcnZpY2Ugd3MsIGludCBzY2VuYXJpbykKLQl7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsgIAotCQl0aGlzLndzPXdzOwotCQl0aGlzLnNjZW5hcmlvPXNjZW5hcmlvOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBhZGFwdGFibGUgKXsKLQkJLy9DaGVjayB3ZXRoZXIgdGhlIGN1cnJlbnQgZHluYW1pYyBXZWIgUHJvamVjdCBpcyBwcm9wZXJseSBidWlsZCB0byBpbnZva2Ugd2ViIHNlcnZpY2UKLQkJUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJdHJ5IHsKLQkJCXByb3BlcnRpZXMubG9hZChuZXcgRmlsZUlucHV0U3RyZWFtKEF4aXMyQ29yZVV0aWxzLnRlbXBSdW50aW1lU3RhdHVzRmlsZUxvY2F0aW9uKCkpKTsKLQkJCWlmIChwcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KEF4aXMyQ29uc3RhbnRzLlBST1BFUlRZX0tFWV9TVEFUVVMpKXsKLQkJCQkgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQkgbW9kZWwuc2V0U2VydmVyU3RhdHVzKHRydWUpOwotCQkJfWVsc2V7Ci0JCQkJc3RhdHVzID0gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoQXhpczJDb3JlVUlNZXNzYWdlcy5FUlJPUl9TRVJWRVJfSVNfTk9UX1NFVCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlzdGF0dXMgPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyhBeGlzMkNvcmVVSU1lc3NhZ2VzLkVSUk9SX0lOVkFMSURfRklMRV9SRUFEX1dSSVRFTCsKLQkJCQkJCQkJCQkJCUF4aXMyQ29yZVVJTWVzc2FnZXMuRVJST1JfU0VSVkVSX0lTX05PVF9TRVQpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlzdGF0dXMgPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyhBeGlzMkNvcmVVSU1lc3NhZ2VzLkVSUk9SX0lOVkFMSURfRklMRV9SRUFEX1dSSVRFTCsKLQkJCQkJCQkJCQkJCUF4aXMyQ29yZVVJTWVzc2FnZXMuRVJST1JfU0VSVkVSX0lTX05PVF9TRVQpOwotCQl9Ci0JCQotCQlpZiAoc2NlbmFyaW8gPT0gV2ViU2VydmljZVNjZW5hcmlvLlRPUERPV04pIHsKLQkJCW1vZGVsLnNldFdzZGxVUkkod3MuZ2V0V2ViU2VydmljZUluZm8oKS5nZXRXc2RsVVJMKCkpOwotCQkJbW9kZWwuc2V0RGF0YWJpbmRpbmdUeXBlKEF4aXMyQ29uc3RhbnRzLkRBVEFfQklORElOR19BREIpOwotCQkJRGVmYXVsdENvZGVnZW5VdGlsIGRlZmF1bHRDb2RlZ2VuVXRpbCA9IG5ldyBEZWZhdWx0Q29kZWdlblV0aWwobW9kZWwpOwotCQkJZGVmYXVsdENvZGVnZW5VdGlsLnBvcHVsYXRlTW9kZWxQYXJhbXNGcm9tV1NETCgpOwotCQkJbW9kZWwuc2V0U2VydmljZXNYTUwodHJ1ZSk7Ci0JCQltb2RlbC5zZXRTZXJ2ZXJYTUxDaGVjayh0cnVlKTsKLQkJCVNlcnZpY2VDb250ZXh0LmdldEluc3RhbmNlKCkuc2V0U2VydmljZU5hbWUobW9kZWwuZ2V0U2VydmljZU5hbWUoKSk7Ci0JCX1lbHNlIGlmIChzY2VuYXJpbyA9PSBXZWJTZXJ2aWNlU2NlbmFyaW8uQk9UVE9NVVApIHsKLQkJCW1vZGVsLnNldFNlcnZpY2VDbGFzcyh3cy5nZXRXZWJTZXJ2aWNlSW5mbygpLmdldEltcGxVUkwoKSk7Ci0JCQkvL3NldCB0aGUgc2VydmljZSBuYW1lIGluc2lkZSBCVVNlcnZpY2VDb250ZXh0IGZvciB1c2VkIGJ5IGNsaWVudCBpZiBpbnZva2UgdG9nZXRoZXIKLQkJCVNlcnZpY2VDb250ZXh0LmdldEluc3RhbmNlKCkuc2V0U2VydmljZU5hbWUoCi0JCQkJCUNvbW1vblV0aWxzLmNsYXNzTmFtZUZyb21RdWFsaWZpZWROYW1lKHdzLmdldFdlYlNlcnZpY2VJbmZvKCkuZ2V0SW1wbFVSTCgpKQotCQkJCQkpOwotCQkJCi0JCQltb2RlbC5zZXRHZW5lcmF0ZVNlcnZpY2VzWE1MKHRydWUpOwotCQl9ZWxzZXsKLQkJCS8vbmV2ZXIgY29tZSBoZXJlCi0JCX0KLQkJCi0JCS8vIEZpeCBmb3IgdGhlIEJ1Z3ppbGxhIEJ1ZyAxNzUwMzAKLQkJLy8gQXhpczI6IFdTREwgcmVwcmVzZW50aW5nIFdlYiBzZXJ2aWNlIG5vdCBwYXNzZWQgdG8gQXhpczIgY2xpZW50Ci0JCS8vIEFmdGVyIHNldHRpbmcgdGhlIGluaXRpYWwgd3NkbFVSTCByZXR1cm4gZnJvbSB0aGUgZnJhbWV3b3JrIHRvIHRoZSBkYXRhIG1vZGVsLAotCQkvLyByZXBsYWNlIGl0IHdpdGggdGhlIGRlcGxveWVkIHdzZGxVUkwKLQkJU3RyaW5nIGRlcGxveWVkV1NETFVSTCA9IEZhY2V0Q29udGFpbmVyVXRpbHMuZ2V0RGVwbG95ZWRXU0RMVVJMKAotCQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChtb2RlbC5nZXRXZWJQcm9qZWN0TmFtZSgpKSwKLQkJCQl3cy5nZXRXZWJTZXJ2aWNlSW5mbygpLmdldFNlcnZlckZhY3RvcnlJZCgpLAotCQkJCXdzLmdldFdlYlNlcnZpY2VJbmZvKCkuZ2V0U2VydmVySW5zdGFuY2VJZCgpLAotCQkJCVNlcnZpY2VDb250ZXh0LmdldEluc3RhbmNlKCkuZ2V0U2VydmljZU5hbWUoKSk7Ci0JCQotCQl3cy5nZXRXZWJTZXJ2aWNlSW5mbygpLnNldFdzZGxVUkwoZGVwbG95ZWRXU0RMVVJMKTsKLQkJCi0JCXJldHVybiBzdGF0dXM7ICAgICAgCQotCX0KLQotCXB1YmxpYyBEYXRhTW9kZWwgZ2V0V2ViU2VydmljZURhdGFNb2RlbCgpCi0JewotCQlyZXR1cm4gbW9kZWw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NyZWF0aW9uL2NvcmUvY29tbWFuZC9BeGlzMlNlcnZpY2VzWE1MVmFsaWRhdGlvbkNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jcmVhdGlvbi9jb3JlL2NvbW1hbmQvQXhpczJTZXJ2aWNlc1hNTFZhbGlkYXRpb25Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NGRjZWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NyZWF0aW9uL2NvcmUvY29tbWFuZC9BeGlzMlNlcnZpY2VzWE1MVmFsaWRhdGlvbkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDExMCAgIDE2ODc2MiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbml0aWFsIGNvZGUgdG8gaW50cm9kdXNlIHRoZSBBeGlzMiBydW50aW1lIHRvIHRoZSBmcmFtZXdvcmsgZm9yIDE2ODc2MgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBBeGlzMlNlcnZpY2VzWE1MVmFsaWRhdGlvbkNvbW1hbmQgZXh0ZW5kcwotCQlBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiB7Ci0KLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQotCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCS8vSGVyZSB3cml0ZSB0aGUgY29kZSB0byB2YWxpZGF0ZSB0aGUgc2VydmljZXMueG1sCi0JICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsgCi0JICAgIHJldHVybiBzdGF0dXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NyZWF0aW9uL2NvcmUvY29tbWFuZC9BeGlzMlNrZWxJbXBsQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NyZWF0aW9uL2NvcmUvY29tbWFuZC9BeGlzMlNrZWxJbXBsQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2IyMjQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jcmVhdGlvbi9jb3JlL2NvbW1hbmQvQXhpczJTa2VsSW1wbENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDEyMyAgIDE2ODc2MiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbml0aWFsIGNvZGUgdG8gaW50cm9kdXNlIHRoZSBBeGlzMiAKLSAqIAkJCQkJCQkJCQkgIHJ1bnRpbWUgdG8gdGhlIGZyYW1ld29yayBmb3IgMTY4NzYyCi0gKiAyMDA3MDQyNiAgIDE4MzA0NiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoCi0gKiAyMDA3MDgyNCAgIDIwMDUxNSBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBOT04tTkxTIG1vdmUgdG8gc2VwZXJhdGUgZmlsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUuY29uc3RhbnQuQXhpczJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUudXRpbHMuRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLmRhdGEuRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLm1lc3NhZ2VzLkF4aXMyQ3JlYXRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLnV0aWxzLkNvbW1vblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1c1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuV2ViU2VydmljZUluZm87Ci0KLXB1YmxpYyBjbGFzcyBBeGlzMlNrZWxJbXBsQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKLQotCXByaXZhdGUgV2ViU2VydmljZUluZm8gd2ViU2VydmljZUluZm87Ci0JcHJpdmF0ZSBEYXRhTW9kZWwgbW9kZWw7Ci0KLQlwdWJsaWMgQXhpczJTa2VsSW1wbENvbW1hbmQoV2ViU2VydmljZUluZm8gd2ViU2VydmljZUluZm8sIERhdGFNb2RlbCBtb2RlbCl7Ci0JCXRoaXMud2ViU2VydmljZUluZm8gPSB3ZWJTZXJ2aWNlSW5mbzsKLQkJdGhpcy5tb2RlbD1tb2RlbDsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJCi0JCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJSUVudmlyb25tZW50IGVudmlyb25tZW50ID0gZ2V0RW52aXJvbm1lbnQoKTsKLQotCQlTdHJpbmcgd29ya3NwYWNlRGlyZWN0b3J5ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS4KLQkJCQkJCQkJCQkJCQlnZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKTsKLQkJU3RyaW5nIGN1cnJlbnREeW5hbWljV2ViUHJvamVjdERpciA9IEZpbGVVdGlscy5hZGRBbm90aGVyTm9kZVRvUGF0aCgKLQkJCQkJCQkJCQkJCQkgICB3b3Jrc3BhY2VEaXJlY3RvcnksIAotCQkJCQkJCQkJCQkJCSAgIG1vZGVsLmdldFdlYlByb2plY3ROYW1lKCkpOwotCQlTdHJpbmcgcHJvamVjdFNyY0RpciA9ICBGaWxlVXRpbHMuYWRkQW5vdGhlck5vZGVUb1BhdGgoCi0JCQkJCQkJCQkJCWN1cnJlbnREeW5hbWljV2ViUHJvamVjdERpciwgCi0JCQkJCQkJCQkJCUF4aXMyQ29uc3RhbnRzLkRJUl9TUkMpOwotCi0JCVN0cmluZyBwYWNrYWdlUGF0aCA9IENvbW1vblV0aWxzLnBhY2tnZU5hbWUyUGF0aE5hbWUobW9kZWwuZ2V0UGFja2FnZVRleHQoKSk7Ci0JCVN0cmluZyBwYWNrYWdlRGlyID0gRmlsZVV0aWxzLmFkZEFub3RoZXJOb2RlVG9QYXRoKHByb2plY3RTcmNEaXIsIHBhY2thZ2VQYXRoKTsKLQkJU3RyaW5nIHNlcnZpY2VTa2VsZXRvbkltcGwgPSBGaWxlVXRpbHMuYWRkQW5vdGhlck5vZGVUb1BhdGgocGFja2FnZURpciwgbW9kZWwuCi0JCQkJCQkJCQkJCQkJCQkJCWdldFNlcnZpY2VOYW1lKCkpOwotCi0JCVN0cmluZyBzZXJ2aWNlU2tlbGV0b25JbXBsVVJMID0gIHNlcnZpY2VTa2VsZXRvbkltcGwgKyBBeGlzMkNvbnN0YW50cy5TS0VMRVRPTl9TVUZGSVg7Ci0JCUlQYXRoIHNlcnZpY2VTa2VsZXRvbkltcGxVUkxQYXRoID0gbmV3IFBhdGgoc2VydmljZVNrZWxldG9uSW1wbFVSTCk7IAotCQl0cnkgewotCQkJLy93ZWJTZXJ2aWNlSW5mby5zZXRJbXBsVVJMKHNlcnZpY2VTa2VsZXRvbkltcGxVUkxQYXRoLnRvRmlsZSgpLnRvVVJMKCkudG9TdHJpbmcoKSk7Ci0JCQkvL1N0cmluZ1tdIGltcGxVUkxBcnJheSA9IHtzZXJ2aWNlU2tlbGV0b25JbXBsVVJMfTsKLQkJCS8vd2ViU2VydmljZUluZm8uc2V0SW1wbFVSTHMoIGltcGxVUkxBcnJheSk7Ci0JCQkKLQkJCVN0cmluZyBzZXJ2aWNlU2tlbGV0b25JbXBsVVJMU3RyaW5nID0gCi0JCQkJc2VydmljZVNrZWxldG9uSW1wbFVSTFBhdGgudG9GaWxlKCkudG9VUkwoKS50b1N0cmluZygpOwotCi0JCQl3ZWJTZXJ2aWNlSW5mby5zZXRJbXBsVVJMKHNlcnZpY2VTa2VsZXRvbkltcGxVUkxTdHJpbmcpOwotCQkJU3RyaW5nW10gaW1wbFVSTEFycmF5ID0ge3NlcnZpY2VTa2VsZXRvbkltcGxVUkxTdHJpbmd9OwotCQkJd2ViU2VydmljZUluZm8uc2V0SW1wbFVSTHMoIGltcGxVUkxBcnJheSk7Ci0KLQkJCQotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJc3RhdHVzID0gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoCi0JCQkJCU5MUy5iaW5kKEF4aXMyQ3JlYXRpb25VSU1lc3NhZ2VzLkVSUk9SX0lOVkFMSURfRklMRV9SRUFEX1dSSVRFTCwKLQkJCQkJCQluZXcgU3RyaW5nW117ZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCl9KSwgZSk7Ci0JCQllbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsgCi0JCX0KLQotCQlyZXR1cm4gc3RhdHVzOwotCQkKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY3JlYXRpb24vY29yZS9jb21tYW5kL0F4aXMyVERDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY3JlYXRpb24vY29yZS9jb21tYW5kL0F4aXMyVERDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwN2U3ZDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NyZWF0aW9uL2NvcmUvY29tbWFuZC9BeGlzMlREQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBXU08yIEluYy4gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogV1NPMiBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDcwMTEwICAgMTY4NzYyIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgY29kZSB0byBpbnRyb2R1c2UgdGhlIEF4aXMyIHJ1bnRpbWUgdG8gdGhlIGZyYW1ld29yayBmb3IgMTY4NzYyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUuY29tbWFuZDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS5kYXRhLkRhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS5tZXNzYWdlcy5BeGlzMkNyZWF0aW9uVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgQXhpczJURENvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiAKLXsKLSAgcHJpdmF0ZSBEYXRhTW9kZWwgbW9kZWw7Ci0gIAotICBwdWJsaWMgQXhpczJURENvbW1hbmQoIERhdGFNb2RlbCBtb2RlbCApCi0gIHsKLSAgICB0aGlzLm1vZGVsID0gbW9kZWw7ICAKLSAgfQotICAKLSAgcHVibGljIElTdGF0dXMgZXhlY3V0ZSggSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGFkYXB0YWJsZSApIAotICB7Ci0gICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOyAgCi0gICAgLy8gQ2hlY2sgZm9yIHRoZSBuZXNzZXNhcnkgZGF0YSBhcmUgYXZhaWxhYmxlIGZvciB0aGUgc2NlbmFyaW8gdG8gYmVnaW4KLSAgICBpZiAobW9kZWwuZ2V0V3NkbFVSSSgpID09IG51bGwpewotCQlzdGF0dXMgPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyhBeGlzMkNyZWF0aW9uVUlNZXNzYWdlcy5FUlJPUl9JTlZBTElEX1NFUlZJQ0VfQ1JFQVRJT04pOwotICAgIH1lbHNlIHsKLQkJc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsgLy8gT2sgdG8gcHJvY2VlZCAKLQl9Ci0gICAgcmV0dXJuIHN0YXR1czsgICAgICAJCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jcmVhdGlvbi9jb3JlL2NvbW1hbmQvQXhpczJURFNlcnZpY2VDcmVhdGlvbkNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jcmVhdGlvbi9jb3JlL2NvbW1hbmQvQXhpczJURFNlcnZpY2VDcmVhdGlvbkNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM0ZTQ3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY3JlYXRpb24vY29yZS9jb21tYW5kL0F4aXMyVERTZXJ2aWNlQ3JlYXRpb25Db21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBXU08yIEluYy4gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogV1NPMiBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDcwNDI2ICAgMTgzMDQ2IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgKLSAqIDIwMDcwNTA3ICAgMTg0NzQwIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgKLSAqIDIwMDcwNjI1ICAgMTkyNTIyIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIGZpeCB0aGUgYnVpbGQgcGF0aCBwcm9ibGVtCi0gKiAyMDA3MDgxMyAgIDE5NjE3MyAgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgRml4IDE5NjE3MywgRFdQIGN1c3RvbSBsb2NhdGlvbiBmaXgKLSAqIDIwMDcwODI0ICAgMjAwNTE1IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIE5PTi1OTFMgbW92ZSB0byBzZXBlcmF0ZSBmaWxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUuY29tbWFuZDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLmNvbnN0YW50LkF4aXMyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLnV0aWxzLkZhY2V0Q29udGFpbmVyVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUudXRpbHMuRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLmRhdGEuRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLm1lc3NhZ2VzLkF4aXMyQ3JlYXRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LklXZWJTZXJ2aWNlOwotCi1wdWJsaWMgY2xhc3MgQXhpczJURFNlcnZpY2VDcmVhdGlvbkNvbW1hbmQgZXh0ZW5kcwotQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gewotCQotICAJcHJpdmF0ZSBEYXRhTW9kZWwgbW9kZWw7Ci0gIAlwcml2YXRlIFN0cmluZyBwcm9qZWN0OwotCi0gIHB1YmxpYyBBeGlzMlREU2VydmljZUNyZWF0aW9uQ29tbWFuZCggRGF0YU1vZGVsIG1vZGVsLElXZWJTZXJ2aWNlIHdzLCBTdHJpbmcgcHJvamVjdCApIHsKLSAgICB0aGlzLm1vZGVsID0gbW9kZWw7ICAKLSAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotICB9Ci0KLXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pCi0JCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsgIAotCUlFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9IGdldEVudmlyb25tZW50KCk7Ci0KLQl0cnkgewotCQkKLQkJU3RyaW5nIHdvcmtzcGFjZURpcmVjdG9yeSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKQotCQkJCQkJCQkJCQkJCQkuZ2V0Um9vdCgpLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpOwotCQlTdHJpbmcgY3VycmVudER5bmFtaWNXZWJQcm9qZWN0RGlyID0gRmFjZXRDb250YWluZXJVdGlscy5nZXRQcm9qZWN0Um9vdCggCi0JCQkJCQkJCQkJCQkJCW1vZGVsLmdldFdlYlByb2plY3ROYW1lKCkpLnRvT1NTdHJpbmcoKTsKLQkJU3RyaW5nIG1hdGFkYXRhRGlyID0gRmlsZVV0aWxzLmFkZEFub3RoZXJOb2RlVG9QYXRoKHdvcmtzcGFjZURpcmVjdG9yeSwKLQkJCQlBeGlzMkNvbnN0YW50cy5ESVJfRE9UX01FVEFEQVRBKTsKLQkgICAgU3RyaW5nIG1hdGFkYXRhUGx1Z2luc0RpciA9IEZpbGVVdGlscy5hZGRBbm90aGVyTm9kZVRvUGF0aChtYXRhZGF0YURpciwKLQkgICAgCQlBeGlzMkNvbnN0YW50cy5ESVJfRE9UX1BMVUdJTlMpOwotCSAgICBTdHJpbmcgbWF0YWRhdGFBeGlzMkRpciA9IEZpbGVVdGlscy5hZGRBbm90aGVyTm9kZVRvUGF0aChtYXRhZGF0YVBsdWdpbnNEaXIsIAotCSAgICAJCUF4aXMyQ29uc3RhbnRzLkFYSVMyX1BST0pFQ1QpOwotCSAgICBTdHJpbmcgdGVtcFNlcnZpY2VzRGlyID0gRmlsZVV0aWxzLmFkZEFub3RoZXJOb2RlVG9QYXRoKG1hdGFkYXRhQXhpczJEaXIsCi0JICAgIAkJQXhpczJDb25zdGFudHMuRElSX1NFUlZJQ0VTKTsKLQkgICAgCi0JICAgIG1vZGVsLnNldFBhdGhUb1dlYlNlcnZpY2VzVGVtcERpcih0ZW1wU2VydmljZXNEaXIpOwotCQkKLQkgICAgLy9FeHBsb2RlZCB0ZW1wZXJvcnkgc2VydmljZXMgZGlyZWN0b3J5Ci0JCVN0cmluZyBjdXJyZW50c2VydmljZXNEaXJlY3RvcnkgPSBGaWxlVXRpbHMuYWRkQW5vdGhlck5vZGVUb1BhdGgodGVtcFNlcnZpY2VzRGlyLCAKLQkJCQkJCQkJCQkJCQkJbW9kZWwuZ2V0U2VydmljZU5hbWUoKSk7Ci0JCVN0cmluZyBtZXRhSW5mRGlyZWN0b3J5ID0gRmlsZVV0aWxzLmFkZEFub3RoZXJOb2RlVG9QYXRoKGN1cnJlbnRzZXJ2aWNlc0RpcmVjdG9yeSwgCi0JCQkJQXhpczJDb25zdGFudHMuRElSX01FVEFfSU5GKTsKLQkJCi0JCS8vQ3JlYXRlIHRoZSBkaXJlY3RvcmllcwotCQkvL0NyZWF0ZSB0aGUgV2Vic2VydmljZXMgc3R1ZmYgb24gdGhlIHdvcmtzcGFjZSAubWF0YWRhdGEgZGlyZWN0b3J5ICAKLQkgICAgRmlsZVV0aWxzLmNyZWF0ZURpcmVjdG9yeXMoY3VycmVudHNlcnZpY2VzRGlyZWN0b3J5KTsKLQkgICAgRmlsZVV0aWxzLmNyZWF0ZURpcmVjdG9yeXMobWV0YUluZkRpcmVjdG9yeSk7CQkgICAgCi0JICAgIAotCSAgICAKLQkgICAgLy9jb3B5IHRoZSBnZW5lcmF0ZWQgcmVzb3VyY2VzIChzZXJ2aWNlcy54bWwgLndzZGwgKSBmaWxlcwotCSAgICAvL2F0IHJlc291cmNlcy9zZXJ2aWNlLnhtbAotCSAgICBTdHJpbmcgY3VycmVudFByb2plY3RSZXNvdXJjZXNEaXJTdHJpbmcgPSBGaWxlVXRpbHMKLQkgICAgCQkuYWRkQW5vdGhlck5vZGVUb1BhdGgoY3VycmVudER5bmFtaWNXZWJQcm9qZWN0RGlyLCAKLQkgICAgCQkJCUF4aXMyQ29uc3RhbnRzLkRJUl9SRVNPVVJDRVMpOwotCSAgICBGaWxlIGN1cnJlbnRQcm9qZWN0UmVzb3VyY2VzRGlyID0gbmV3IEZpbGUoY3VycmVudFByb2plY3RSZXNvdXJjZXNEaXJTdHJpbmcpOwotCSAgICBpZighY3VycmVudFByb2plY3RSZXNvdXJjZXNEaXIuZXhpc3RzKCkpewotCSAgICAJY3VycmVudFByb2plY3RSZXNvdXJjZXNEaXIubWtkaXIoKTsKLQkgICAgfQotCSAgICBGaWxlVXRpbHMuY29weURpcmVjdG9yeShjdXJyZW50UHJvamVjdFJlc291cmNlc0RpciwgbmV3IEZpbGUobWV0YUluZkRpcmVjdG9yeSkpOwotICAgICAgICAKLSAgICAgICAgLy9Db3B5IHRoZSBjbGFzc2VzIGRpcmVjdG9yeSB0byB0aGUgc2V2aWNlcyBkaXJlY3RvcnkKLSAgICAgICAgU3RyaW5nIGNsYXNzZXNEaXJlY3RvcnkgPSBudWxsOwotCQlJUGF0aCBwcm9qZWN0Um9vdCA9IEZhY2V0Q29udGFpbmVyVXRpbHMuZ2V0UHJvamVjdFJvb3QocHJvamVjdCk7Ci0JCUlQYXRoIGRlZmF1bHRDbGFzc2VzU3ViRGlyZWN0b3J5ID0gUmVzb3VyY2VVdGlscy5nZXRKYXZhT3V0cHV0TG9jYXRpb24oCi0gICAgICAgIAkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3QpKTsKLQkJSVBhdGggZGVmYXVsdENsYXNzZXNTdWJEaXJlY3RvcnlXaXRob3V0UHJvamVjdFJvb3QgPSBSZXNvdXJjZVV0aWxzLmdldEphdmFPdXRwdXRMb2NhdGlvbigKLSAgICAgICAgCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdCkpCi0gICAgICAgIAkJLnJlbW92ZUZpcnN0U2VnbWVudHMoMSkubWFrZUFic29sdXRlKCk7Ci0JCWlmKHByb2plY3RSb290LnRvT1NTdHJpbmcoKS5jb250YWlucyhGYWNldENvbnRhaW5lclV0aWxzLmdldFdvcmtzcGFjZSgpLnRvT1NTdHJpbmcoKSkpewotCQkJY2xhc3Nlc0RpcmVjdG9yeSA9IEZhY2V0Q29udGFpbmVyVXRpbHMuZ2V0V29ya3NwYWNlKCkKLQkJCQkJCS5hcHBlbmQoZGVmYXVsdENsYXNzZXNTdWJEaXJlY3RvcnkpLnRvT1NTdHJpbmcoKTsKLQkJfWVsc2V7Ci0JCQljbGFzc2VzRGlyZWN0b3J5ID0gcHJvamVjdFJvb3QKLQkJCQkJCS5hcHBlbmQoZGVmYXVsdENsYXNzZXNTdWJEaXJlY3RvcnlXaXRob3V0UHJvamVjdFJvb3QpLnRvT1NTdHJpbmcoKTsKLQkJfQotCQkKLSAgICAgICAgLy9UT0RPIGNvcHkgb25seSB0aGUgcmVsZXZlbnQgLmNsYXNzZXMgdG8gdGhlIGFhcgotCQlGaWxlVXRpbHMuY29weURpcmVjdG9yeShuZXcgRmlsZShjbGFzc2VzRGlyZWN0b3J5KSwKLQkJCQkJCQkJbmV3IEZpbGUoY3VycmVudHNlcnZpY2VzRGlyZWN0b3J5KSk7Ci0JCQotLy8JCS8vQ3JlYXRlIHRoZSAuYWFyIGZpbGUgCi0vLwkJU3RyaW5nIGFhckRpclN0cmluZyA9ICBGaWxlVXRpbHMuYWRkQW5vdGhlck5vZGVUb1BhdGgod2Vic2VydmljZXNEaXIsIAotLy8gCQlBeGlzMkNyZWF0aW9uVUlNZXNzYWdlcy5ESVJfQUFSKTsKLS8vCQlGaWxlIGFhckRpciA9IG5ldyBGaWxlKGFhckRpclN0cmluZyk7Ci0vLwkJRmlsZVV0aWxzLmNyZWF0ZURpcmVjdG9yeXMoYWFyRGlyU3RyaW5nKTsKLS8vCQlBQVJGaWxlV3JpdGVyIGFhckZpbGVXcml0ZXIgPSBuZXcgQUFSRmlsZVdyaXRlcigpOwotLy8JCUZpbGUgc2VydmlzZURpciA9IG5ldyBGaWxlKHNlcnZpY2VzRGlyZWN0b3J5KTsKLS8vCQlhYXJGaWxlV3JpdGVyLndyaXRlQUFSRmlsZShhYXJEaXIsIHNlcnZpY2VOYW1lICsgCi0vLwkJQXhpczJDcmVhdGlvblVJTWVzc2FnZXMuRklMRV9BQVIsIHNlcnZpc2VEaXIpOwotCQkKLQkJCi0JCS8vSW1wb3J0IGFsbCB0aGUgc3R1ZmYgZm9ybSB0aGUgLm1hdGFkYXRhIGRpcmVjdG9yeSB0byBpbnNpZGUgdGhlIGN1cnJlbnQgd2ViIHByb2plY3QKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJc3RhdHVzID0gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoCi0JCQkJCU5MUy5iaW5kKEF4aXMyQ3JlYXRpb25VSU1lc3NhZ2VzLkVSUk9SX0lOVkFMSURfRklMRV9SRUFEX1dSSVRFTCwKLQkJCQkJCQluZXcgU3RyaW5nW117ZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCl9KSwgZSk7Ci0JCQllbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsgCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlzdGF0dXMgPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cygKLQkJCQkJTkxTLmJpbmQoQXhpczJDcmVhdGlvblVJTWVzc2FnZXMuRVJST1JfSU5WQUxJRF9TRVJWSUNFX0NSRUFUSU9OLAotCQkJCQkJCW5ldyBTdHJpbmdbXXtlLmdldExvY2FsaXplZE1lc3NhZ2UoKX0pLCBlKTsKLQkJCWVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOyAKLQkJfQotCSAgICAKLQkKLSAgICAKLSAgICByZXR1cm4gc3RhdHVzOwotfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NyZWF0aW9uL2NvcmUvY29tbWFuZC9BeGlzMldTREwySmF2YUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jcmVhdGlvbi9jb3JlL2NvbW1hbmQvQXhpczJXU0RMMkphdmFDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMzhkNjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NyZWF0aW9uL2NvcmUvY29tbWFuZC9BeGlzMldTREwySmF2YUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IFdTTzIgSW5jLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBXU08yIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzAxMTggICAxNjg3NjIgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgSW5pdGlhbCBjb2RlIHRvIGludHJvZHVzZSB0aGUgQXhpczIgCi0gKiAJCQkJCQkJCQkJICBydW50aW1lIHRvIHRoZSBmcmFtZXdvcmsgZm9yIDE2ODc2MgotICogMjAwNzA0MjYgICAxODMwNDYgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aAotICogMjAwNzA1MDcgICAxODQ3Mjkgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aAotICogMjAwNzA1MTggICAxODczMTEgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgRml4aW5nIHRlc3QgcmVzb3VyY2UgYWRkaXRpb24KLSAqIDIwMDcwODEzICAgMTk2MTczICBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBGaXggMTk2MTczLCBEV1AgY3VzdG9tIGxvY2F0aW9uIGZpeAotICogMjAwNzA4MTQgICAxODc4NDAgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgRml4aW5nIDE4Nzg0MCBJVEUgbWVzc2FnZQotICogMjAwNzA4MTQgICAxOTM1OTMgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgY3VzdG9tIHBhY2thZ2UgbmFtZSBmaXgKLSAqIDIwMDgwMjEzICAgMjE4OTEwIGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUuY29tbWFuZDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUudXRpbHMuQ29udGVudENvcHlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS51dGlscy5XU0RMMkphdmFHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUudXRpbHMuV1NETFByb3BlcnR5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLnV0aWxzLkNsYXNzTG9hZGluZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUudXRpbHMuRmFjZXRDb250YWluZXJVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS51dGlscy5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUuZGF0YS5EYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUubWVzc2FnZXMuQXhpczJDcmVhdGlvblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUudXRpbHMuUGF0aExvYWRpbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1c1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSVN0YXR1c0hhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIEF4aXMyV1NETDJKYXZhQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKLQkKLQkgIHByaXZhdGUgRGF0YU1vZGVsIG1vZGVsOwotCQkKLQkgIHB1YmxpYyBBeGlzMldTREwySmF2YUNvbW1hbmQoIERhdGFNb2RlbCBtb2RlbCApewotCSAgICB0aGlzLm1vZGVsID0gbW9kZWw7ICAKLQkgIH0KLQotCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykKLQkJCQkJCQkJCQkJCQkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCQotCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7ICAKLQkJSUVudmlyb25tZW50IGVudmlyb25tZW50ID0gZ2V0RW52aXJvbm1lbnQoKTsKLQkJSVN0YXR1c0hhbmRsZXIgc3RhdHVzSGFuZGxlciA9IGVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKTsJCi0JCQotCQlQYXRoTG9hZGluZ1V0aWwuaW5pdChtb2RlbCk7Ci0JCVN0cmluZyB0ZW1wQ29kZWdlbk91dHB1dExvY2F0aW9uID1QYXRoTG9hZGluZ1V0aWwuZ2V0VGVtcENvZGVnZW5PdXRwdXRMb2NhdGlvbigpOwotCQlTdHJpbmcgY3VycmVudER5bmFtaWNXZWJQcm9qZWN0RGlyID0gRmFjZXRDb250YWluZXJVdGlscy5nZXRQcm9qZWN0Um9vdCgKLQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuZ2V0V2ViUHJvamVjdE5hbWUoKSkudG9PU1N0cmluZygpOwotCQkKLQkJRmlsZSB0ZW1wQ29kZWdlbkxvY2F0aW9uRmlsZSA9IG5ldyBGaWxlKHRlbXBDb2RlZ2VuT3V0cHV0TG9jYXRpb24pOwotCQlpZiAodGVtcENvZGVnZW5Mb2NhdGlvbkZpbGUuZXhpc3RzKCkpRmlsZVV0aWxzLmRlbGV0ZURpcmVjdG9yaWVzKHRlbXBDb2RlZ2VuT3V0cHV0TG9jYXRpb24pOwotCQlGaWxlVXRpbHMuY3JlYXRlRGlyZWN0b3J5cyh0ZW1wQ29kZWdlbk91dHB1dExvY2F0aW9uKTsKLSAgICAgICAgV1NETDJKYXZhR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBXU0RMMkphdmFHZW5lcmF0b3IoKTsgCi0gICAgICAgIAotICAgICAgICAvL0F4aXNTZXJ2aWNlIHNlcnZpY2U7Ci0gICAgICAgIE9iamVjdCBheGlzU2VydmljZUluc3RhbmNlOwotICAgICAgIAotICAgICAgICBTdHJpbmcgdHJhbnNmb3JtZXJGYWN0b3J5ID0gbnVsbDsKLSAgICAgICAgYm9vbGVhbiB0cmFuc2Zvcm1lckZhY3RvcnlNb2RpZmllZCA9IGZhbHNlOwotICAgICAgICAKLQl0cnkgewotCQkvLyB1c2UgdGhlIHhhbGFuIHRyYW5zZm9ybWVyIGZhY3RvcnkgaWYgbG9hZGFibGUKLQkJdHJ5IHsKLQkJCXRyYW5zZm9ybWVyRmFjdG9yeSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3RvcnkiKTsKLQkJCUNsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUueGFsYW4ucHJvY2Vzc29yLlRyYW5zZm9ybWVyRmFjdG9yeUltcGwiKTsKLQkJCVN0cmluZyBtb2RpZmllZFRyYW5zZm9ybWVyRmFjdG9yeSA9ICJvcmcuYXBhY2hlLnhhbGFuLnByb2Nlc3Nvci5UcmFuc2Zvcm1lckZhY3RvcnlJbXBsIjsKLQkJCWlmICghbW9kaWZpZWRUcmFuc2Zvcm1lckZhY3RvcnkuZXF1YWxzKHRyYW5zZm9ybWVyRmFjdG9yeSkpIHsKLQkJCQlTeXN0ZW0uc2V0UHJvcGVydHkoImphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5IiwgbW9kaWZpZWRUcmFuc2Zvcm1lckZhY3RvcnkpOwotCQkJCXRyYW5zZm9ybWVyRmFjdG9yeU1vZGlmaWVkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQljYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBJZiBjbGFzcyBub3QgZm91bmQsIGtlZXAgdXNpbmcgdGhlIGRlZmF1bHQgdHJhbnNmb3JtZXIgZmFjdG9yeS4KLQkJfQotCQkKLQkJLy9zZXJ2aWNlID0gZ2VuZXJhdG9yLmdldEF4aXNTZXJ2aWNlKG1vZGVsLmdldFdzZGxVUkkoKSk7Ci0JCUNsYXNzTG9hZGluZ1V0aWwuaW5pdChtb2RlbC5nZXRXZWJQcm9qZWN0TmFtZSgpKTsKLQkJYXhpc1NlcnZpY2VJbnN0YW5jZSA9IGdlbmVyYXRvci5nZXRBeGlzU2VydmljZShtb2RlbC5nZXRXc2RsVVJJKCkpOwotICAgICAgICBNYXAgb3B0aW9uc01hcCA9IGdlbmVyYXRvci5maWxsT3B0aW9uTWFwKAkKLSAgICAgICAgCWZhbHNlLCAgLy9hc3luYyBhbHdheXMgZmFsc2UKLSAgICAgICAgICAgIGZhbHNlLAkvL3N5bmMgYWx3YXlzIGZhbHNlCi0gICAgICAgICAgICB0cnVlLCAgIC8vaXMgc2VydmVyc2lkZSB0cnVlCi0gICAgICAgICAgICBtb2RlbC5pc1NlcnZlclhNTENoZWNrKCksCi0gICAgICAgICAgICBmYWxzZSwgIC8vTm8gdGVzdCBjYXNlIHdpdGggb3V0IHN0dWIKLSAgICAgICAgICAgIG1vZGVsLmlzR2VuZXJhdGVBbGxDaGVjaygpLAotICAgICAgICAgICAgKG1vZGVsLmdldFNlcnZpY2VOYW1lKCkhPW51bGwpP21vZGVsLmdldFNlcnZpY2VOYW1lKCk6bnVsbCwKLSAgICAgICAgICAgIChtb2RlbC5nZXRQb3J0TmFtZSgpIT1udWxsKT9tb2RlbC5nZXRQb3J0TmFtZSgpOm51bGwsCi0gICAgICAgICAgICAobW9kZWwuZ2V0RGF0YWJpbmRpbmdUeXBlKCkudG9Mb3dlckNhc2UoKSE9bnVsbCk/Ci0gICAgICAgICAgICAJCW1vZGVsLmdldERhdGFiaW5kaW5nVHlwZSgpLnRvTG93ZXJDYXNlKCk6Ci0gICAgICAgICAgICAJCW51bGwsCi0gICAgICAgICAgICAobW9kZWwuZ2V0V3NkbFVSSSgpIT1udWxsKT9tb2RlbC5nZXRXc2RsVVJJKCk6bnVsbCwKLSAgICAgICAgICAgIChtb2RlbC5nZXRQYWNrYWdlVGV4dCgpIT1udWxsKT9tb2RlbC5nZXRQYWNrYWdlVGV4dCgpOm51bGwsCi0gICAgICAgICAgICAiamF2YSIsCi0gICAgICAgICAgICB0ZW1wQ29kZWdlbk91dHB1dExvY2F0aW9uLAotICAgICAgICAgICAgbW9kZWwuZ2V0TmFtZXNwYXNlVG9QYWNrYWdlTWFwcGluZygpLAotICAgICAgICAgICAgbW9kZWwuaXNHZW5lcmF0ZVNlcnZlclNpZGVJbnRlcmZhY2UoKQotICAgICAgICAgICk7Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgLy9Db2RlR2VuQ29uZmlndXJhdGlvbiBjb2RlZ2VuQ29uZmlnID0gbmV3IENvZGVHZW5Db25maWd1cmF0aW9uKHNlcnZpY2UsIG9wdGlvbnNNYXApOwotCQlDbGFzcyBDb2RlR2VuQ29uZmlndXJhdGlvbkNsYXNzID0gQ2xhc3NMb2FkaW5nVXRpbAotCQkJCS5sb2FkQ2xhc3NGcm9tQW50Q2xhc3NMb2FkZXIoIm9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLkNvZGVHZW5Db25maWd1cmF0aW9uIik7Ci0KLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCi0JCS8vRml4IGZvciB0aGUgQXhpczIgMS4yIAotCQkvL0NvbnN0cnVjdG9yIENvZGVHZW5Db25maWd1cmF0aW9uQ29uc3RydWN0b3IgPSBDb2RlR2VuQ29uZmlndXJhdGlvbkNsYXNzCi0JCS8vCQkuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW117YXhpc1NlcnZpY2VJbnN0YW5jZS5nZXRDbGFzcygpLE1hcC5jbGFzc30pOwotCQkvL09iamVjdCBDb2RlR2VuQ29uZmlndXJhdGlvbkluc3RhbmNlID0gQ29kZUdlbkNvbmZpZ3VyYXRpb25Db25zdHJ1Y3RvcgotCQkvLwkJLm5ld0luc3RhbmNlKG5ldyBPYmplY3RbXXtheGlzU2VydmljZUluc3RhbmNlLG9wdGlvbnNNYXB9KTsKLQkJCi0JCUNvbnN0cnVjdG9yIENvZGVHZW5Db25maWd1cmF0aW9uQ29uc3RydWN0b3IgPSBDb2RlR2VuQ29uZmlndXJhdGlvbkNsYXNzCi0JCQkJLmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1tde01hcC5jbGFzc30pOwotCQlPYmplY3QgQ29kZUdlbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSA9IENvZGVHZW5Db25maWd1cmF0aW9uQ29uc3RydWN0b3IKLQkJCQkubmV3SW5zdGFuY2UobmV3IE9iamVjdFtde29wdGlvbnNNYXB9KTsKLQkJCi0JCS8vIGNvZGVnZW5Db25maWcuYWRkQXhpc1NlcnZpY2Uoc2VydmljZSk7Ci0JCU1ldGhvZCBhZGRBeGlzU2VydmljZU1ldGhvZCA9IENvZGVHZW5Db25maWd1cmF0aW9uQ2xhc3MKLQkJCQkuZ2V0TWV0aG9kKCJhZGRBeGlzU2VydmljZSIsIG5ldyBDbGFzc1tdeyBheGlzU2VydmljZUluc3RhbmNlLmdldENsYXNzKCl9KTsKLQkJYWRkQXhpc1NlcnZpY2VNZXRob2QuaW52b2tlKENvZGVHZW5Db25maWd1cmF0aW9uSW5zdGFuY2UsIAotCQkJCQkJCW5ldyBPYmplY3RbXXtheGlzU2VydmljZUluc3RhbmNlfSk7Ci0JCQotICAgICAgICAvL3NldCB0aGUgd3NkbCBkZWZpbmlzaW9uIGZvciBjb2RlZ2VuIGNvbmZpZyBmb3Igc2tlbGV0b24gZ2VuZXJhcmlvbi4KLSAgICAgICAgV1NETFByb3BlcnR5UmVhZGVyIHJlYWRlciA9IG5ldyBXU0RMUHJvcGVydHlSZWFkZXIoKTsKLSAgICAgICAgcmVhZGVyLnJlYWRXU0RMKG1vZGVsLmdldFdlYlByb2plY3ROYW1lKCksbW9kZWwuZ2V0V3NkbFVSSSgpKTsKLSAgICAgICAgT2JqZWN0IHdzZGxEZWZpbml0aW9uSW5zdGFuY2UgPSByZWFkZXIuZ2V0V3NkbERlZmluaXRpb25JbnN0YW5jZSgpOwotICAgICAgICAvL0NsYXNzIERlZmluaXRpb25DbGFzcyA9IENsYXNzTG9hZGluZ1V0aWwubG9hZENsYXNzRnJvbUFudENsYXNzTG9hZGVyKCJqYXZheC53c2RsLkRlZmluaXRpb24iKTsKLSAgICAgICAgLy9jb2RlZ2VuQ29uZmlnLnNldFdzZGxEZWZpbml0aW9uKHdzZGxEZWZpbml0aW9uKTsKLQkJTWV0aG9kIHNldFdzZGxEZWZpbml0aW9uTWV0aG9kID0gQ29kZUdlbkNvbmZpZ3VyYXRpb25DbGFzcwotCQkJCS5nZXRNZXRob2QoInNldFdzZGxEZWZpbml0aW9uIiwgbmV3IENsYXNzW117cmVhZGVyLmdldFdzZGxEZWZpbml0aW9uQ2xhc3MoKX0pOwotCQlzZXRXc2RsRGVmaW5pdGlvbk1ldGhvZC5pbnZva2UoQ29kZUdlbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSwgCi0JCQkJCW5ldyBPYmplY3RbXXt3c2RsRGVmaW5pdGlvbkluc3RhbmNlfSk7ICAgICAgIAotICAgICAgICAKLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCi0KLQkJLy9zZXQgdGhlIGJhc2VVUkkKLSAgICAgICAgLy9jb2RlZ2VuQ29uZmlnLnNldEJhc2VVUkkoZ2VuZXJhdG9yLmdldEJhc2VVcmkobW9kZWwuZ2V0V3NkbFVSSSgpKSk7Ci0JCQotCQlNZXRob2Qgc2V0QmFzZVVSSU1ldGhvZCA9IENvZGVHZW5Db25maWd1cmF0aW9uQ2xhc3MKLQkJCS5nZXRNZXRob2QoInNldEJhc2VVUkkiLCBuZXcgQ2xhc3NbXXsgU3RyaW5nLmNsYXNzfSk7Ci0JCXNldEJhc2VVUklNZXRob2QuaW52b2tlKENvZGVHZW5Db25maWd1cmF0aW9uSW5zdGFuY2UsIAotCQkJCQkJCQluZXcgT2JqZWN0W117Z2VuZXJhdG9yLmdldEJhc2VVcmkobW9kZWwuZ2V0V3NkbFVSSSgpKX0pOwotCQkKLQkJLy9HZXQgdGhlIG5hbWVzcGFjZSBmcm9tIHRoZSBBeGlzU2VydmljZSBhbmQgc2V0IGl0IGluIHRoZSBjb25maWd1cmF0aW9uIAotCQlDbGFzcyBBeGlzU2VydmljZUNsYXNzID0gQ2xhc3NMb2FkaW5nVXRpbAotCQkJCQkubG9hZENsYXNzRnJvbUFudENsYXNzTG9hZGVyKCJvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlIik7CQkKLQkJTWV0aG9kIGdldFRhcmdldE5hbWVzcGFjZU1ldGhvZCA9IEF4aXNTZXJ2aWNlQ2xhc3MuZ2V0TWV0aG9kKCJnZXRUYXJnZXROYW1lc3BhY2UiLCBudWxsKTsKLQkJT2JqZWN0IHRhcmdldE5hbWVzcGFjZSA9IGdldFRhcmdldE5hbWVzcGFjZU1ldGhvZC5pbnZva2UoYXhpc1NlcnZpY2VJbnN0YW5jZSwgbnVsbCk7Ci0JCQotCQlPYmplY3Qgc3RyaW5nUmV0dXJuID0gbnVsbDsKLQkJaWYobW9kZWwuZ2V0UGFja2FnZVRleHQoKSE9bnVsbCl7Ci0JCQlzdHJpbmdSZXR1cm4gPSBtb2RlbC5nZXRQYWNrYWdlVGV4dCgpOwotCQl9ZWxzZXsKLQkJCUNsYXNzIFVSTFByb2Nlc3NvckNsYXNzID0gQ2xhc3NMb2FkaW5nVXRpbAotCQkJCQkubG9hZENsYXNzRnJvbUFudENsYXNzTG9hZGVyKCJvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVVJMUHJvY2Vzc29yIik7Ci0JCQlNZXRob2QgbWFrZVBhY2thZ2VOYW1lTWV0aG9kID0gVVJMUHJvY2Vzc29yQ2xhc3MKLQkJCQkJLmdldE1ldGhvZCgibWFrZVBhY2thZ2VOYW1lIiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzfSk7Ci0JCQlzdHJpbmdSZXR1cm4gPSBtYWtlUGFja2FnZU5hbWVNZXRob2QuaW52b2tlKG51bGwsIG5ldyBPYmplY3RbXXt0YXJnZXROYW1lc3BhY2V9KTsKLQkJfQotCQkKLQkJbW9kZWwuc2V0UGFja2FnZVRleHQoc3RyaW5nUmV0dXJuLnRvU3RyaW5nKCkpOwotCQkKLQkJTWV0aG9kIHNldFBhY2thZ2VOYW1lTWV0aG9kID0gQ29kZUdlbkNvbmZpZ3VyYXRpb25DbGFzcwotCQkJCQkuZ2V0TWV0aG9kKCJzZXRQYWNrYWdlTmFtZSIsIG5ldyBDbGFzc1tde1N0cmluZy5jbGFzc30pOwotCQlzZXRQYWNrYWdlTmFtZU1ldGhvZC5pbnZva2UoQ29kZUdlbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSwgbmV3IE9iamVjdFtde3N0cmluZ1JldHVybn0pOwotCQkKLSAgICAgICAgLy9uZXcgQ29kZUdlbmVyYXRpb25FbmdpbmUoY29kZWdlbkNvbmZpZykuZ2VuZXJhdGUoKTsKLQkJQ2xhc3MgQ29kZUdlbmVyYXRpb25FbmdpbmVDbGFzcyA9IENsYXNzTG9hZGluZ1V0aWwKLQkJCQkubG9hZENsYXNzRnJvbUFudENsYXNzTG9hZGVyKCJvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5Db2RlR2VuZXJhdGlvbkVuZ2luZSIpOwotCQlDb25zdHJ1Y3RvciBDb2RlR2VuZXJhdGlvbkVuZ2luZUNvbnN0cnVjdG9yID0gQ29kZUdlbmVyYXRpb25FbmdpbmVDbGFzcwotCQkJCQkJLmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1tde0NvZGVHZW5Db25maWd1cmF0aW9uSW5zdGFuY2UuZ2V0Q2xhc3MoKX0pOwotCQlPYmplY3QgQ29kZUdlbmVyYXRpb25FbmdpbmVJbnN0YW5jZSAgPSBDb2RlR2VuZXJhdGlvbkVuZ2luZUNvbnN0cnVjdG9yCi0JCQkJCQkubmV3SW5zdGFuY2UobmV3IE9iamVjdFtde0NvZGVHZW5Db25maWd1cmF0aW9uSW5zdGFuY2V9KTsKLQkJCi0JCS8vSW52b2tlIENvZGVnZW4gTWV0aG9kCi0JCU1ldGhvZCBnZW5lcmF0ZU1ldGhvZCA9IENvZGVHZW5lcmF0aW9uRW5naW5lQ2xhc3MuZ2V0TWV0aG9kKCJnZW5lcmF0ZSIsIG51bGwpOwotCQlnZW5lcmF0ZU1ldGhvZC5pbnZva2UoQ29kZUdlbmVyYXRpb25FbmdpbmVJbnN0YW5jZSwgbnVsbCk7Ci0JCQotICAgICAgICAKLQkJLy9Db3B5IHRoZSBleGlzdGluZyBjb2RlZ2VuIHJlc3VsdHMgdG8gdGhlIGN1cnJlbnQgcHJvamVjdAotICAgICAgICBDb250ZW50Q29weVV0aWxzIGNvbnRlbnRDb3B5VXRpbHMgPSBuZXcgQ29udGVudENvcHlVdGlscygpOwotCSAgICBzdGF0dXMgPSBjb250ZW50Q29weVV0aWxzLmNvcHlEaXJlY3RvcnlSZWN1cnNpdmVseUludG9Xb3Jrc3BhY2UoCi0JICAgIAkJCQkJCQl0ZW1wQ29kZWdlbk91dHB1dExvY2F0aW9uLCAKLQkgICAgCQkJCQkJCWN1cnJlbnREeW5hbWljV2ViUHJvamVjdERpciwgCi0JICAgIAkJCQkJCQltb25pdG9yLCAKLQkgICAgCQkJCQkJCXN0YXR1c0hhbmRsZXIpOwotCi0gICAgICAgIAotCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCXN0YXR1cyA9IFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKE5MUy5iaW5kKAotCQkJCQkJCQkJCQlBeGlzMkNyZWF0aW9uVUlNZXNzYWdlcy5FUlJPUl9DT0RFR0VOX0VYQ0VQVElPTiwKLQkJCQkJCQkJCQkJbmV3IFN0cmluZ1tdeyIgOiAiK2UuZ2V0Q2F1c2UoKX0pLAotCQkJCQkJCQkJCWUpOwotCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQllbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsgCi0JfSBmaW5hbGx5IHsKLQkJaWYgKHRyYW5zZm9ybWVyRmFjdG9yeU1vZGlmaWVkKSB7Ci0JCQkvLyByZXN0b3JlIHRvIHRoZSBvcmlnaW5hbCBUcmFuc2Zvcm1lckZhY3RvcnkKLQkJCWlmICh0cmFuc2Zvcm1lckZhY3RvcnkgPT0gbnVsbCkgewotCQkJCVN5c3RlbS5jbGVhclByb3BlcnR5KCJqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeSIpOyAKLQkJCX0gZWxzZSB7Ci0JCQkJU3lzdGVtLnNldFByb3BlcnR5KCJqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeSIsIHRyYW5zZm9ybWVyRmFjdG9yeSk7IAotCQkJfQotCQl9Ci0JfQotCQkKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jcmVhdGlvbi9jb3JlL2NvbW1hbmQvQXhpczJXZWJzZXJ2aWNlc1NlcnZlckNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jcmVhdGlvbi9jb3JlL2NvbW1hbmQvQXhpczJXZWJzZXJ2aWNlc1NlcnZlckNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ3ZTNjOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY3JlYXRpb24vY29yZS9jb21tYW5kL0F4aXMyV2Vic2VydmljZXNTZXJ2ZXJDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IFdTTzIgSW5jLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBXU08yIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzAxMTAgICAxNjg3NjIgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgSW5pdGlhbCBjb2RlIHRvIGludHJvZHVzZSB0aGUgQXhpczIgCi0gKiAJCQkJCQkJCQkJICBydW50aW1lIHRvIHRoZSBmcmFtZXdvcmsgZm9yIDE2ODc2MgotICogMjAwNzA1MTAgICAxNzI5MjYgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgRml4IDE3MjkyNiBVc2UgVXRpbCBDbGFzc2VzCi0gKiAyMDA3MDgxMyAgIDE5NjE3MyAgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgRml4IDE5NjE3MywgRFdQIGN1c3RvbSBsb2NhdGlvbiBmaXgKLSAqIDIwMDcwODI0ICAgMjAwNTE1IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIE5PTi1OTFMgbW92ZSB0byBzZXBlcmF0ZSBmaWxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUuY29tbWFuZDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUudXRpbHMuQ29udGVudENvcHlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5jb25zdGFudC5BeGlzMkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS51dGlscy5GYWNldENvbnRhaW5lclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLnV0aWxzLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS5kYXRhLkRhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklTdGF0dXNIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuV2ViU2VydmljZVNjZW5hcmlvOwotCi1wdWJsaWMgY2xhc3MgQXhpczJXZWJzZXJ2aWNlc1NlcnZlckNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiB7Ci0KLQlwcml2YXRlIERhdGFNb2RlbCBtb2RlbDsKLQlwcml2YXRlIGludCBzY2VuYXJpbzsKLQotCXB1YmxpYyBBeGlzMldlYnNlcnZpY2VzU2VydmVyQ29tbWFuZCggRGF0YU1vZGVsIG1vZGVsLCBpbnQgc2NlbmFyaW8gKXsKLQkJdGhpcy5tb2RlbCA9IG1vZGVsOyAgCi0JCXRoaXMuc2NlbmFyaW8gPSBzY2VuYXJpbzsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQotCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCi0JCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJSUVudmlyb25tZW50IGVudmlyb25tZW50ID0gZ2V0RW52aXJvbm1lbnQoKTsKLQkJSVN0YXR1c0hhbmRsZXIgc3RhdHVzSGFuZGxlciA9IGVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKTsJCi0KLQkJU3RyaW5nIHdlYkNvbnRhaW5lckRpclN0cmluZyA9IEZhY2V0Q29udGFpbmVyVXRpbHMucGF0aFRvV2ViUHJvamVjdENvbnRhaW5lcigKLQkJCQltb2RlbC5nZXRXZWJQcm9qZWN0TmFtZSgpKTsKLQotCQlDb250ZW50Q29weVV0aWxzIGNvbnRlbnRDb3B5VXRpbHMgPSBuZXcgQ29udGVudENvcHlVdGlscygpOwotCQkKLQkJLy9DaGVjayBmb3IgdGhlIHNlcnZlciBzdGF0dXMKLQkJaWYgKG1vZGVsLmdldFNlcnZlclN0YXR1cygpKXsKLQkJCWlmIChzY2VuYXJpbyA9PSBXZWJTZXJ2aWNlU2NlbmFyaW8uQk9UVE9NVVApewotCQkJCS8vSW1wb3J0IHRoZSB0ZW1wb3J5IHdlYnNlcnZpY2VzIGRpcmVjdG9yeSBhY2NvcmRpbmcgdG8gdGhlIFJlc291cmNlcyBBUEkgb2YgZWNsaXBzZSAKLQkJCQlTdHJpbmcgd2Vic2VydmljZVRlbXBEaXJTdHJpbmcgPSBtb2RlbC5nZXRQYXRoVG9XZWJTZXJ2aWNlc1RlbXBEaXIoKTsKLQkJCQlTdHJpbmcgcmVwb3NpdG9yeVN0cmluZyA9IHdlYkNvbnRhaW5lckRpclN0cmluZyAKLQkJCQkrIEZpbGUuc2VwYXJhdG9yICsgQXhpczJDb25zdGFudHMuRElSX1dFQl9JTkYgCi0JCQkJKyBGaWxlLnNlcGFyYXRvciArIEF4aXMyQ29uc3RhbnRzLkRJUl9TRVJWSUNFUzsKLQkJCQkvL0NvcHkgdGhlIGV4aXN0aW5nIHNlcnZpY2VzIHRvIHRoZSByZXBvc2l0b3J5Ci0JCQkJc3RhdHVzID0gY29udGVudENvcHlVdGlscy5jb3B5RGlyZWN0b3J5UmVjdXJzaXZlbHlJbnRvV29ya3NwYWNlKAotCQkJCQkJCQkJCQl3ZWJzZXJ2aWNlVGVtcERpclN0cmluZywgCi0JCQkJCQkJCQkJCXJlcG9zaXRvcnlTdHJpbmcsIAotCQkJCQkJCQkJCQltb25pdG9yLCAKLQkJCQkJCQkJCQkJc3RhdHVzSGFuZGxlcik7Ci0JCQkJRmlsZVV0aWxzLmRlbGV0ZURpcmVjdG9yaWVzKHdlYnNlcnZpY2VUZW1wRGlyU3RyaW5nKTsKLQotCi0JCQl9ZWxzZSBpZiAoc2NlbmFyaW8gPT0gV2ViU2VydmljZVNjZW5hcmlvLlRPUERPV04pewotCQkJCS8vRG8gdG9wZG93bgotCQkJCVN0cmluZyB3ZWJzZXJ2aWNlVGVtcERpclN0cmluZyA9IG1vZGVsLmdldFBhdGhUb1dlYlNlcnZpY2VzVGVtcERpcigpOwotCQkJCVN0cmluZyByZXBvc2l0b3J5U3RyaW5nID0gd2ViQ29udGFpbmVyRGlyU3RyaW5nIAotCQkJCSsgRmlsZS5zZXBhcmF0b3IgKyBBeGlzMkNvbnN0YW50cy5ESVJfV0VCX0lORiAKLQkJCQkrIEZpbGUuc2VwYXJhdG9yICsgQXhpczJDb25zdGFudHMuRElSX1NFUlZJQ0VTOwotCQkJCS8vQ29weSB0aGUgZXhpc3Rpbmcgc2VydmljZXMgdG8gdGhlIHJlcG9zaXRvcnkKLQkJCQlzdGF0dXMgPSBjb250ZW50Q29weVV0aWxzLmNvcHlEaXJlY3RvcnlSZWN1cnNpdmVseUludG9Xb3Jrc3BhY2UoCi0JCQkJCQkJCQkJCXdlYnNlcnZpY2VUZW1wRGlyU3RyaW5nLCAKLQkJCQkJCQkJCQkJcmVwb3NpdG9yeVN0cmluZywgCi0JCQkJCQkJCQkJCW1vbml0b3IsIAotCQkJCQkJCQkJCQlzdGF0dXNIYW5kbGVyKTsKLQkJCQlGaWxlVXRpbHMuZGVsZXRlRGlyZWN0b3JpZXMod2Vic2VydmljZVRlbXBEaXJTdHJpbmcpOwotCQkJfQotCQkJc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfWVsc2V7Ci0JCQlzdGF0dXMgPSBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJfQotCi0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY3JlYXRpb24vY29yZS9tZXNzYWdlcy9BeGlzMkNyZWF0aW9uVUkucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jcmVhdGlvbi9jb3JlL21lc3NhZ2VzL0F4aXMyQ3JlYXRpb25VSS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjAzZDRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jcmVhdGlvbi9jb3JlL21lc3NhZ2VzL0F4aXMyQ3JlYXRpb25VSS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgV1NPMiBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0jIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIDIwMDcwMTEwICAgMTY4NzYyIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgY29kZSB0byBpbnRyb2R1c2UgdGhlIEF4aXMyIAotIwkJCQkJCQkJCQkgcnVudGltZSB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjIKLSMgMjAwNzA1MTEgICAxODY0NDAgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCBmaXggMTg2NDQwCi0jIDIwMDcwNTE3ICAgMTg3MzA3IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEZpeCAxODczMDcgUHJvcGVydHkgRmlsZSBGaXgKLSMgMjAwNzA1MjkgICAxODg3NDIgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgZml4IGZvciAxODg3NDIKLSMgMjAwNzA2MDEgICAxOTA1MDUgcG1vb2drQGNhLmlibS5jb20gLSBQZXRlciBNb29nawotIyAyMDA4MDEzMCAgIDIxNjk5NyBrYXRlcEB3c28yLmNvbSAtIEthdGUgUHJpY2UKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgQXhpczIgc2VydmVyIGNvbXBvbmVudCB0eXBlIGxhYmVscwotIwotTEFCRUxfSEFWRV9TRVJWSUNFU19YTUxfRklMRT1Vc2UgYW4gZXhpc3Rpbmcgc2VydmljZXMueG1sIGZpbGUKLUxBQkVMX0RFRkFVTFRfU0VSVklDRVNfWE1MX0ZJTEU9R2VuZXJhdGUgYSBkZWZhdWx0IHNlcnZpY2VzLnhtbCBmaWxlCi1MQUJFTF9BWElTMl9QUkVGRVJFTkNFX1BBR0U9QXhpczIgV2ViIFNlcnZpY2UgSmF2YSBCZWFuIENvbmZpZ3VyYXRpb24KLUxBQkVMX0FYSVMyX1BSRUZFUkVOQ0VfUEFHRV9IRUFESU5HPUF4aXMyIFdlYiBTZXJ2aWNlIEphdmEgQmVhbiBDb25maWd1cmF0aW9uCi1MQUJFTF9BWElTMl9QUkVGRVJFTkNFX1BBR0VfU1VCX0hFQURJTkc9Q3VzdG9taXplIHlvdXIgV2ViIHNlcnZpY2UKLUxBQkVMX0JST1dTRT0mQnJvd3NlCi1MQUJFTF9KQVZBXzJfV1NETF9QQUdFX0hFQURJTkc9QXhpczIgV2ViIFNlcnZpY2UgU2tlbGV0b24gSmF2YSBCZWFuIENvbmZpZ3VyYXRpb24KLUxBQkVMX0pBVkFfMl9XU0RMX1BBR0VfU1VCX0hFQURJTkc9U2VsZWN0IHRoZSBhcHByb3ByaWF0ZSBjb2RlIGdlbmVyYXRpb24gc2V0dGluZ3MKLUxBQkVMX1NFUlZJQ0VfTkFNRV9DQVBUSU9OPVNlcnZpY2UgTmFtZQotTEFCRUxfR0VORVJBVEVfVEVTVENBU0VfQ0FQVElPTj1HZW5lcmF0ZSBhIEpVbml0IHRlc3QgY2FzZSB0byB0ZXN0IHRoZSBzZXJ2aWNlCi1MQUJFTF9EQVRBQklORElOR19DQVBUSU9OPURhdGFiaW5kaW5nCi1MQUJFTF9QT1JUTkFNRT1Qb3J0IE5hbWUKLUxBQkVMX0dFTkVSQVRFX0FMTD1HZW5lcmF0ZSBhbGwgdHlwZXMgZm9yIGFsbCBlbGVtZW50cyByZWZlcnJlZCBieSBzY2hlbWFzCi1MQUJFTF9HRU5FUkFURV9TRVJWRVJTSURFX0lOVEVSRkFDRT1HZW5lcmF0ZSBhbiBpbnRlcmZhY2UgZm9yIHRoZSBza2VsZXRvbgotTEFCRUxfUEFDS0VHRV9OQU1FPUN1c3RvbSBwYWNrYWdlIG5hbWUKLUxBQkVMX05BTUVTUEFDRT1OYW1lc3BhY2UKLUxBQkVMX1BBQ0tBR0U9UGFja2FnZQotTEFCRUxfTkFNRVNQQUNFX1RPX1BBQ0tBR0U9TmFtZXNwYWNlIHRvIHBhY2thZ2UgbWFwcGluZ3MKLQotIwotIyBBeGlzMiBzZXJ2ZXIgY29tcG9uZW50IHR5cGUgZXJyb3IKLSMKLUVSUk9SX0lOVkFMSURfU0VSVklDRVNfWE1MPVlvdSBtdXN0IHNlbGVjdCBhIHZhbGlkIHNlcnZpY2VzLnhtbCBmaWxlCi1FUlJPUl9JTlZBTElEX0ZJTEVfUkVBRF9XUklURUw9RXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIHJlYWRpbmcgb3Igd3JpdGluZyBmaWxlIHswfQotRVJST1JfSU5WQUxJRF9XU0RMX0ZJTEVfUkVBRF9XUklURUw9RXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIHJlYWRpbmcgb3Igd3JpdGluZyBXU0RMIHswfQotRVJST1JfSU5WQUxJRF9TRVJWSUNFX0NSRUFUSU9OPUV4Y2VwdGlvbiBvY2N1cnJlZCBkdXJpbmcgc2VydmljZSBjcmVhdGlvbgotRVJST1JfQ09ERUdFTl9FWENFUFRJT049RXhjZXB0aW9uIG9jY3VycmVkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gZm9yIHRoZSBXU0RMIHswfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NyZWF0aW9uL2NvcmUvbWVzc2FnZXMvQXhpczJDcmVhdGlvblVJTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jcmVhdGlvbi9jb3JlL21lc3NhZ2VzL0F4aXMyQ3JlYXRpb25VSU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMjQ5ZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NyZWF0aW9uL2NvcmUvbWVzc2FnZXMvQXhpczJDcmVhdGlvblVJTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDExMCAgIDE2ODc2MiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbml0aWFsIGNvZGUgdG8gaW50cm9kdXNlIHRoZSBBeGlzMiBydW50aW1lIHRvIHRoZSBmcmFtZXdvcmsgZm9yIDE2ODc2MgotICogMjAwNzA0MjYgICAxODMwNDYgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aAotICogMjAwNzA1MTEgICAxODY0NDAgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCBmaXggMTg2NDQwCi0gKiAyMDA3MDUxNyAgIDE4NzMwNyBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBGaXggMTg3MzA3IFByb3BlcnR5IEZpbGUgRml4Ci0gKiAyMDA3MDYwMSAgIDE5MDUwNSBwbW9vZ2tAY2EuaWJtLmNvbSAtIFBldGVyIE1vb2drCi0gKiAyMDA3MDgyNCAgIDIwMDUxNSBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBOT04tTkxTIG1vdmUgdG8gc2VwZXJhdGUgZmlsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLm1lc3NhZ2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIEF4aXMyQ3JlYXRpb25VSU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQotCS8vZ2V0IHRoZSBsYWJsZXMgZnJvbSB0aGlzIG1hc3NhZ2VzIHRvIHRoZSBwcm9wZXJ0aWVzIGZpbGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAKLQkJCSJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS5tZXNzYWdlcy5BeGlzMkNyZWF0aW9uVUkiOwkvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEF4aXMyQ3JlYXRpb25VSU1lc3NhZ2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0JLy9sYWJlbHMKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9IQVZFX1NFUlZJQ0VTX1hNTF9GSUxFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX0RFRkFVTFRfU0VSVklDRVNfWE1MX0ZJTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfQVhJUzJfUFJFRkVSRU5DRV9QQUdFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX0FYSVMyX1BSRUZFUkVOQ0VfUEFHRV9IRUFESU5HOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX0FYSVMyX1BSRUZFUkVOQ0VfUEFHRV9TVUJfSEVBRElORzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9CUk9XU0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfSkFWQV8yX1dTRExfUEFHRV9IRUFESU5HOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX0pBVkFfMl9XU0RMX1BBR0VfU1VCX0hFQURJTkc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfU0VSVklDRV9OQU1FX0NBUFRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfR0VORVJBVEVfVEVTVENBU0VfQ0FQVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9EQVRBQklORElOR19DQVBUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX1BPUlROQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX0dFTkVSQVRFX0FMTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9HRU5FUkFURV9TRVJWRVJTSURFX0lOVEVSRkFDRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9QQUNLRUdFX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfTkFNRVNQQUNFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX1BBQ0tBR0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfTkFNRVNQQUNFX1RPX1BBQ0tBR0U7Ci0KLQkvL2Vycm9yCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJST1JfSU5WQUxJRF9TRVJWSUNFU19YTUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJST1JfSU5WQUxJRF9GSUxFX1JFQURfV1JJVEVMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUk9SX0lOVkFMSURfV1NETF9GSUxFX1JFQURfV1JJVEVMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUk9SX0lOVkFMSURfU0VSVklDRV9DUkVBVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJPUl9DT0RFR0VOX0VYQ0VQVElPTjsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEF4aXMyQ3JlYXRpb25VSU1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jcmVhdGlvbi9jb3JlL3BsdWdpbi9XZWJTZXJ2aWNlQXhpczJDcmVhdGlvbkNvcmVQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jcmVhdGlvbi9jb3JlL3BsdWdpbi9XZWJTZXJ2aWNlQXhpczJDcmVhdGlvbkNvcmVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE5YWY4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY3JlYXRpb24vY29yZS9wbHVnaW4vV2ViU2VydmljZUF4aXMyQ3JlYXRpb25Db3JlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IFdTTzIgSW5jLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBXU08yIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzAxMzAgICAxNjg3NjIgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgSW5pdGlhbCBjb2RlIHRvIGludHJvZHVzZSB0aGUgQXhpczIgCi0gKiAJCQkJCQkJCQkJICBydW50aW1lIHRvIHRoZSBmcmFtZXdvcmsgZm9yIDE2ODc2MgotICogMjAwNzA0MjYgICAxODMwNDYgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLnBsdWdpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlQXhpczJDcmVhdGlvbkNvcmVQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCi0JLy8gVGhlIHBsdWctaW4gSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUiOwotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIFdlYlNlcnZpY2VBeGlzMkNyZWF0aW9uQ29yZVBsdWdpbiBwbHVnaW47Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIFdlYlNlcnZpY2VBeGlzMkNyZWF0aW9uQ29yZVBsdWdpbigpIHsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW5zI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKgotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgV2ViU2VydmljZUF4aXMyQ3JlYXRpb25Db3JlUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY3JlYXRpb24vY29yZS91dGlscy9BQVJGaWxlV3JpdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY3JlYXRpb24vY29yZS91dGlscy9BQVJGaWxlV3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZWViYjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NyZWF0aW9uL2NvcmUvdXRpbHMvQUFSRmlsZVdyaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBXU08yIEluYy4gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogV1NPMiBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDcwMTEwICAgMTY4NzYyIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgY29kZSB0byBpbnRyb2R1c2UgdGhlIEF4aXMyIAotICogCQkJCQkJCQkJCSAgcnVudGltZSB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjIKLSAqIDIwMDcwODI0ICAgMjAwNTE1IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIE5PTi1OTFMgbW92ZSB0byBzZXBlcmF0ZSBmaWxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUudXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLmNvbnN0YW50LkF4aXMyQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgQUFSRmlsZVdyaXRlciBleHRlbmRzIEphcnsKLQotICAgIHB1YmxpYyBBQVJGaWxlV3JpdGVyKCkgewotICAgICAgICB0aGlzLnNldFByb2plY3QobmV3IFByb2plY3QoKSk7Ci0gICAgICAgIHRoaXMuZ2V0UHJvamVjdCgpLmluaXQoKTsKLSAgICAgICAgdGhpcy5zZXRUYXNrVHlwZShBeGlzMkNvbnN0YW50cy5KQVJfVEFTSyk7Ci0gICAgICAgIHRoaXMuc2V0VGFza05hbWUoQXhpczJDb25zdGFudHMuSkFSX1RBU0spOwotICAgICAgICB0aGlzLnNldE93bmluZ1RhcmdldChuZXcgb3JnLmFwYWNoZS50b29scy5hbnQuVGFyZ2V0KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlQUFSRmlsZShGaWxlIG91dHB1dEZvbGRlciwKLSAgICAJCQkJCQkgU3RyaW5nIG91dHB1dEZpbGVOYW1lLAotICAgIAkJCQkJCSBGaWxlIGlucHV0RmlsZUZvbGRlcikgdGhyb3dzIElPRXhjZXB0aW9uLEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKCFvdXRwdXRGb2xkZXIuZXhpc3RzKCkpewotICAgICAgICAgICAgb3V0cHV0Rm9sZGVyLm1rZGlyKCk7IC8vY3JlYXRlIHRoZSBvdXRwdXQgcGF0aAotICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgIGlmICghb3V0cHV0Rm9sZGVyLmlzRGlyZWN0b3J5KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgRmlsZSB0YXJnZXRGaWxlID0gbmV3IEZpbGUob3V0cHV0Rm9sZGVyLG91dHB1dEZpbGVOYW1lKTsKLSAgICAgICAgdGhpcy5zZXRCYXNlZGlyKGlucHV0RmlsZUZvbGRlcik7Ci0gICAgICAgIHRoaXMuc2V0RGVzdEZpbGUodGFyZ2V0RmlsZSk7Ci0KLSAgICAgICAgLy9ydW4gdGhlIHRhc2sKLSAgICAgICAgdGhpcy5wZXJmb3JtKCk7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NyZWF0aW9uL2NvcmUvdXRpbHMvQ29tbW9uVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jcmVhdGlvbi9jb3JlL3V0aWxzL0NvbW1vblV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxZDA0ZmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NyZWF0aW9uL2NvcmUvdXRpbHMvQ29tbW9uVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDcwMTEwICAgMTY4NzYyIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgY29kZSB0byBpbnRyb2R1c2UgdGhlIEF4aXMyIAotICogCQkJCQkJCQkJCSAgcnVudGltZSB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS51dGlsczsKLQotCi1wdWJsaWMgY2xhc3MgQ29tbW9uVXRpbHMgewotCQotCSBwdWJsaWMgc3RhdGljIFN0cmluZyBjbGFzc05hbWVGcm9tUXVhbGlmaWVkTmFtZShTdHJpbmcgcXVhbGlmaWVkQ2Fsc3NOYW1lKXsKLQkJIC8vVGhpcyB3YXMgZG9uZSBkdWUgdG8gbm90IHNwbGl0dGluZyB3aXRoIC4gU3RyYW5nZQotCQkgcXVhbGlmaWVkQ2Fsc3NOYW1lID0gcXVhbGlmaWVkQ2Fsc3NOYW1lLnJlcGxhY2UoJy4nLCAnOicpOwotCQkgU3RyaW5nW10gcGFydHMgPSBxdWFsaWZpZWRDYWxzc05hbWUuc3BsaXQoIjoiKTsKLQkJIGlmIChwYXJ0cy5sZW5ndGggPT0gMCl7Ci0JCQkgcmV0dXJuICIiOwotCQkgfQotCQkgcmV0dXJuIHBhcnRzW3BhcnRzLmxlbmd0aC0xXTsKLQkgfQotCSAgCi0JIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhY2thZ2VOYW1lRnJvbVF1YWxpZmllZE5hbWUoU3RyaW5nIHF1YWxpZmllZENhbHNzTmFtZSl7Ci0JCSAvL1RoaXMgd2FzIGRvbmUgZHVlIHRvIG5vdCBzcGxpdHRpbmcgd2l0aCAuIFN0cmFuZ2UKLQkJIHF1YWxpZmllZENhbHNzTmFtZSA9IHF1YWxpZmllZENhbHNzTmFtZS5yZXBsYWNlKCcuJywgJzonKTsKLQkJIFN0cmluZ1tdIHBhcnRzID0gcXVhbGlmaWVkQ2Fsc3NOYW1lLnNwbGl0KCI6Iik7Ci0JCSBTdHJpbmdCdWZmZXIgcGFja2FnZU5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCSBmb3IgKGludCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aC0xOyBpKyspIHsKLQkJCSBwYWNrYWdlTmFtZS5hcHBlbmQocGFydHNbaV0pOwotCQkJIGlmICghIChpID09IHBhcnRzLmxlbmd0aC0yKSl7Ci0JCQkJIHBhY2thZ2VOYW1lLmFwcGVuZCgiLiIpOwotCQkJIH0KLQkJIH0KLQkJIHJldHVybiBwYWNrYWdlTmFtZS50b1N0cmluZygpOwotCSB9Ci0JIAotCSAKLQkgcHVibGljIHN0YXRpYyBTdHJpbmcgcGFja2dlTmFtZTJQYXRoTmFtZShTdHJpbmcgcGFja2FnZU5hbWUpewotCQkgcGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZS5yZXBsYWNlKCcuJywgJy8nKTsKLQkJIHJldHVybiBwYWNrYWdlTmFtZTsKLQkgfQotCSAKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NyZWF0aW9uL2NvcmUvdXRpbHMvUGF0aExvYWRpbmdVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY3JlYXRpb24vY29yZS91dGlscy9QYXRoTG9hZGluZ1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkyNjAxMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY3JlYXRpb24vY29yZS91dGlscy9QYXRoTG9hZGluZ1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDMzMCAgIDE2ODc2MiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbml0aWFsIGNvZGUgdG8gaW50cm9kdXNlIHRoZSBBeGlzMiAKLSAqIAkJCQkJCQkJCQkgIHJ1bnRpbWUgdG8gdGhlIGZyYW1ld29yayBmb3IgMTY4NzYyCi0gKiAyMDA3MDQyNiAgIDE4MzA0NiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoCi0gKiAyMDA3MDUwNyAgIDE4NDc0MCBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoCi0gKiAyMDA3MDUwNyAgIDE4NTY4NiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoCi0gKiAyMDA3MDgyNCAgIDIwMDUxNSBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBOT04tTkxTIG1vdmUgdG8gc2VwZXJhdGUgZmlsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLnV0aWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLmNvbnN0YW50LkF4aXMyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLnV0aWxzLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS5kYXRhLkRhdGFNb2RlbDsKLQotcHVibGljIGNsYXNzIFBhdGhMb2FkaW5nVXRpbCB7Ci0JCi0JLy9Nb2RlbAotCXByaXZhdGUgc3RhdGljICBEYXRhTW9kZWwgbW9kZWwgPSBudWxsOwotCi0JLy9QYXRocwotCXByaXZhdGUgc3RhdGljIFN0cmluZyB0ZW1wQ29kZWdlbk91dHB1dExvY2F0aW9uID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgY3VycmVudER5bmFtaWNXZWJQcm9qZWN0RGlyID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgd29ya3NwYWNlRGlyZWN0b3J5ID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgY3VycmVudFByb2plY3RXZWJQcm9qZWN0TmFtZSA9IG51bGw7Ci0JCi0JLy9BbHJlYWR5IENvbXB1dGVkCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBhbHJlYWR5SW5pdCA9IGZhbHNlOwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gYWxyZWFkeUNvbXB1dGVUZW1wQ29kZWdlbk91dHB1dExvY2F0aW9uID0gZmFsc2U7Ci0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBhbHJlYWR5Q29tcHV0ZUN1cnJlbnREeW5hbWljV2ViUHJvamVjdERpciA9IGZhbHNlOwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gYWxyZWFkeUNvbXB1dGVXb3Jrc3BhY2VEaXJlY3RvcnkgPSBmYWxzZTsKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHJlcXVpcmVUb3VwZGF0ZU1vZGVsID0gZmFsc2U7Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGluaXQoRGF0YU1vZGVsIGlucHV0TW9kZWwpewotCQlyZXF1aXJlVG91cGRhdGVNb2RlbCA9ICFhbHJlYWR5SW5pdCB8fCAKLQkJIWN1cnJlbnRQcm9qZWN0V2ViUHJvamVjdE5hbWUuZXF1YWxzKGlucHV0TW9kZWwuZ2V0V2ViUHJvamVjdE5hbWUoKSk7Ci0JCWlmKHJlcXVpcmVUb3VwZGF0ZU1vZGVsKXsKLQkJbW9kZWwgPSBpbnB1dE1vZGVsOwotCQljdXJyZW50UHJvamVjdFdlYlByb2plY3ROYW1lID0gaW5wdXRNb2RlbC5nZXRXZWJQcm9qZWN0TmFtZSgpOwotCQl9Ci0JCX0KLQotCXB1YmxpYwlzdGF0aWMgU3RyaW5nIGdldFdvcmtzcGFjZURpcmVjdG9yeSgpIHsKLQkJaWYgKCFhbHJlYWR5Q29tcHV0ZVdvcmtzcGFjZURpcmVjdG9yeSl7Ci0JCQl3b3Jrc3BhY2VEaXJlY3RvcnkgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpCi0JCQkuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0JCQlhbHJlYWR5Q29tcHV0ZVdvcmtzcGFjZURpcmVjdG9yeSA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIHdvcmtzcGFjZURpcmVjdG9yeTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q3VycmVudER5bmFtaWNXZWJQcm9qZWN0RGlyKCl7Ci0JCWlmICghYWxyZWFkeUNvbXB1dGVDdXJyZW50RHluYW1pY1dlYlByb2plY3REaXIgfHwgcmVxdWlyZVRvdXBkYXRlTW9kZWwpewotCQkJY3VycmVudER5bmFtaWNXZWJQcm9qZWN0RGlyID0gRmlsZVV0aWxzLmFkZEFub3RoZXJOb2RlVG9QYXRoKAotCQkJZ2V0V29ya3NwYWNlRGlyZWN0b3J5KCksIG1vZGVsLmdldFdlYlByb2plY3ROYW1lKCkpOwotCQkJYWxyZWFkeUNvbXB1dGVDdXJyZW50RHluYW1pY1dlYlByb2plY3REaXIgPSB0cnVlOwotCQl9Ci0JCXJldHVybiBjdXJyZW50RHluYW1pY1dlYlByb2plY3REaXI7Ci0JfQotCQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRlbXBDb2RlZ2VuT3V0cHV0TG9jYXRpb24oKSB7Ci0JCWlmICghYWxyZWFkeUNvbXB1dGVUZW1wQ29kZWdlbk91dHB1dExvY2F0aW9uKXsKLQkJCVN0cmluZ1tdIG5vZGVzID0gewkKLQkJCQkJQXhpczJDb25zdGFudHMuRElSX0RPVF9NRVRBREFUQSwKLQkJCQkJQXhpczJDb25zdGFudHMuRElSX0RPVF9QTFVHSU5TLAotCQkJCQlBeGlzMkNvbnN0YW50cy5BWElTMl9QUk9KRUNULAotCQkJCQlBeGlzMkNvbnN0YW50cy5DT0RFR0VOX1JFU1VMVFN9OwotCQkJdGVtcENvZGVnZW5PdXRwdXRMb2NhdGlvbiA9IEZpbGVVdGlscy5hZGROb2Rlc1RvUGF0aChnZXRXb3Jrc3BhY2VEaXJlY3RvcnkoKSwgbm9kZXMpOwotCQkJYWxyZWFkeUNvbXB1dGVUZW1wQ29kZWdlbk91dHB1dExvY2F0aW9uID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gdGVtcENvZGVnZW5PdXRwdXRMb2NhdGlvbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jcmVhdGlvbi9jb3JlL3V0aWxzL1BsdWdpbkxvY2F0aW9uRmluZGVyVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NyZWF0aW9uL2NvcmUvdXRpbHMvUGx1Z2luTG9jYXRpb25GaW5kZXJVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4YTRhYTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NyZWF0aW9uL2NvcmUvdXRpbHMvUGx1Z2luTG9jYXRpb25GaW5kZXJVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBXU08yIEluYy4gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogV1NPMiBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDcwMTMwICAgMTY4NzYyIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgY29kZSB0byBpbnRyb2R1c2UgdGhlIEF4aXMyIAotICogCQkJCQkJCQkJCSAgcnVudGltZSB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS51dGlsczsKLQotCi1wdWJsaWMgY2xhc3MgUGx1Z2luTG9jYXRpb25GaW5kZXJVdGlsIHsKLS8vCS8qKgotLy8JICogIAotLy8JICogQHJldHVybiByZXR1cm5zIGEgVmVjdG9yIGNvbnRhaW5pbmcgUGx1Z2luRGF0YSBvYmplY3RzLgotLy8JICogRWFjaCBQbHVnaW5EYXRhIG9iamVjdCByZXByZXNlbnRzIGEgUGx1Z2luIGZvdW5kIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAotLy8JICogcGx1Z2luIGRpcmVjdG9yaWVzCi0vLwkgKiBhLiB0aGUgdGFyZ2V0UGxhdGZvcm1Mb2NhdGlvblxlY2xpcHNlXHBsdWdpbnMgZGlyZWN0b3J5LCAKLS8vCSAqIGIuIG90aGVyIHBsdWdpbiBkaXJlY3RvcmllcyBhcyBzcGVjaWZpZWQgYnkgKi5saW5rIGZpbGVzIHVuZGVyIAotLy8JICogICAgdGFyZ2V0UGxhdGZvcm1cZWNsaXBzZVxsaW5rcyBkaXJlY3RvcnkgCi0vLwkgKiovIAotLy8JcHVibGljIHN0YXRpYyBWZWN0b3IgZ2V0UGx1Z2luc0luVGFyZ2V0UGxhdGZvcm0oKXsKLS8vCQkvKioKLS8vCQkvL3N0ZXAxOiBHZXQgcGF0aCBvZiB0YXJnZXQgcGxhdGZvcm0uCi0vLwkJLy9zdGVwMjogUHJlcGFyZSBwYXRoIG9mIGxpbmtzIGZvbGRlci4KLS8vCQkvL3N0ZXAzOiBHZXQgbGlzdCBvZiBmaWxlcyBpbiBsaW5rcyBmb2xkZXIuCi0vLwkJLy9zdGVwNDogUGFyc2UgZWFjaCBsaW5rIGZpbGUgYW5kIGdldCB0aGUgcGF0aCBvZiBsaW5rZWQgRWNsaXBzZSBmb2xkZXIuCi0vLwkJLy9zdGVwNTogUHJlcGFyZSBhIGxpc3Qgb2YgYWxsIHBsdWdpbiByb290IGZvbGRlcnMgCi0vLwkJLy8gICAgICAgKEVjbGlwc2UgcGx1Z2lucyBhbmQgbGlua2VkIEVjbGlwc2UgcGx1Z2lucykuCi0vLwkJLy9zdGVwNjogNmEuIEZvciBlYWNoIHBsdWdpbiByb290IGZvbGRlciwgCi0vLwkJLy8gICAgICAgNmIuIGdvIHRvIGVhY2ggcGx1Z2luIGRpcmVjdG9yeSBhbmQgZ2V0IHBhdGggb2YgcGx1Z2luLnhtbC4KLS8vCQkvL3N0ZXA3OiBQYXJzZSB0aGUgcGx1Z2luLnhtbCBmaWxlIHRvIGdldCBwbHVnaW4gaWQsIHBsdWdpbiB2ZXJzaW9uLCAKLS8vCQkvLyAgICAgICBhbmQgc3RvcmUgaW4gdmVjdG9ycywgbGlzdHMsIGV0Yy4KLS8vCQkvL3N0ZXA4OiBHbyBiYWNrIHRvIHN0ZXAgNiB0byBjb250aW51ZSB3aXRoIG5leHQgcGx1Z2luIGRpcmVjdG9yeS4KLS8vCQkqKi8KLS8vCi0vLwkJLy9zdGVwMTogR2V0IHBhdGggb2YgdGFyZ2V0IHBsYXRmb3JtLiAKLS8vCQkvL0ZhbGwgYmFjayB0byBFY2xpcHNlIGluc3RhbGwgbG9jYXRpb24gaWYgdGFyZ2V0cGxhdGZvcm0gaW4gbm90IHNldC4KLS8vCQlVUkwgcGxhdEZvcm1VUkwgPSBQbGF0Zm9ybS5nZXRJbnN0YWxsTG9jYXRpb24oKS5nZXRVUkwoKTsKLS8vCQlMb2NhdGlvbiBsb2NhdGlvbiA9IFBsYXRmb3JtLmdldEluc3RhbGxMb2NhdGlvbigpOwotLy8JCUlQYXRoIGVjbGlwc2VQYXRoID0gbnVsbCA7CQkKLS8vCi0vLwkJLy9HZXQgcGF0aCBvZiB0YXJnZXQgcGxhdGZvcm0gYWdhaW5zdCB3aGljaCB0aGUgdXNlcnMgb2YgdGhpcyB0b29sIAotLy8JCS8vd2lsbCBjb21waWxlIHRoZWlyIGNvZGUuCQotLy8vLwkJSVBhdGggdGFyZ2V0UGxhdEZvcm1Mb2NhdGlvbiA9IG5ldyBQYXRoKGdldFRhcmdldFBsYXRmb3JtUGF0aCh0cnVlKSk7Ci0vLy8vCQlJUGF0aCB0YXJnZXRQbGF0Rm9ybUxvY2F0aW9uID0gbmV3IFBhdGgoU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpKTsKLS8vCi0vLy8vCQlpZihfdXNlVGFyZ2V0UGxhdGZvcm0gPT0gZmFsc2UpCi0vLwkJCWVjbGlwc2VQYXRoID0gbmV3IFBhdGgocGxhdEZvcm1VUkwuZ2V0UGF0aCgpKTsKLS8vLy8JCWVsc2UKLS8vLy8JCQllY2xpcHNlUGF0aCA9IHRhcmdldFBsYXRGb3JtTG9jYXRpb247Ci0vLwkJCi0vLy8vCQlzaG93TWVzc2FnZSgiQ29uc2lkZXJpbmcgdGFyZ2V0IHBsYXRmb3JtIHRvIGJlOiAiICsgCi0vLy8vCQkJCQllY2xpcHNlUGF0aC50b1N0cmluZygpKTsKLS8vCQkKLS8vCQkvL3N0ZXAyOiBQcmVwYXJlIHBhdGggb2YgbGlua3MgZm9sZGVyLgotLy8JCS8vc3RlcDM6IEdldCBsaXN0IG9mIGZpbGVzIGluIGxpbmtzIGZvbGRlci4JCQotLy8JCS8vc3RlcDQ6IFBhcnNlIGVhY2ggbGluayBmaWxlIGFuZCBnZXQgdGhlIHBhdGggb2YgbGlua2VkIEVjbGlwc2UgZm9sZGVyLgotLy8JCUlQYXRoIGxpbmtzUGF0aCA9IG5ldyBQYXRoKCBlY2xpcHNlUGF0aC50b1N0cmluZygpICkuYXBwZW5kKCIvbGlua3MiKTsKLS8vCQlTdHJpbmcgbGlua2VkUGF0aHNbXSA9IGdldExpbmtlZFBhdGhzKGxpbmtzUGF0aC50b1N0cmluZygpKTsKLS8vCQlpbnQgbGlua2VkUGF0aExlbmd0aCA9IDA7Ci0vLwkJaWYobnVsbCAhPSBsaW5rZWRQYXRocyl7Ci0vLwkJCWxpbmtlZFBhdGhMZW5ndGggPSBsaW5rZWRQYXRocy5sZW5ndGg7Ci0vLwkJfQotLy8JCQotLy8JCS8vc3RlcDU6IFByZXBhcmUgYSBsaXN0IG9mIGFsbCBwbHVnaW4gcm9vdCBmb2xkZXJzIAotLy8JCS8vICAgICAgIChFY2xpcHNlIHBsdWdpbnMgYW5kIGxpbmtlZCBFY2xpcHNlIHBsdWdpbnMpLgotLy8JCUlQYXRoIGVjbGlwc2VQbHVnaW5Sb290Rm9sZGVyc1tdID0gbmV3IElQYXRoW2xpbmtlZFBhdGhMZW5ndGggKyAxXTsKLS8vCQllY2xpcHNlUGx1Z2luUm9vdEZvbGRlcnNbMF0gPSAKLS8vCQkJbmV3IFBhdGgoIGVjbGlwc2VQYXRoLnRvU3RyaW5nKCkgKS5hcHBlbmQoIi9wbHVnaW5zIik7Ci0vLwkJaWYobnVsbCAhPSBsaW5rZWRQYXRocyl7Ci0vLwkJCWZvcihpbnQgaT0wOyBpPGxpbmtlZFBhdGhzLmxlbmd0aDsgaSsrKXsKLS8vCQkJCWVjbGlwc2VQbHVnaW5Sb290Rm9sZGVyc1tpKzFdID0gCi0vLwkJCQluZXcgUGF0aChsaW5rZWRQYXRoc1tpXSkuYXBwZW5kKCIvZWNsaXBzZS9wbHVnaW5zIik7Ci0vLwkJCX0KLS8vCQl9Ci0vLwotLy8JCS8vc3RlcDY6IDZhLiBGb3IgZWFjaCBwbHVnaW4gcm9vdCBmb2xkZXIsIAotLy8JCS8vICAgICAgIDZiLiBnbyB0byBlYWNoIHBsdWdpbiBkaXJlY3RvcnkgYW5kIGdldCBwYXRoIG9mIHBsdWdpbi54bWwuCi0vLwkJLy9zdGVwNzogUGFyc2UgdGhlIHBsdWdpbi54bWwgZmlsZSB0byBnZXQgcGx1Z2luIGlkLCBwbHVnaW4gdmVyc2lvbiwgCi0vLwkJLy8gICAgICAgYW5kIHN0b3JlIGluIHZlY3RvcnMsIGxpc3RzLCBldGMuCi0vLwkJVmVjdG9yIHZlY3RvcnNJblRoaXNWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0vLwkJZm9yKGludCBpPTA7IGk8ZWNsaXBzZVBsdWdpblJvb3RGb2xkZXJzLmxlbmd0aDsgaSsrKXsKLS8vCQkJU3lzdGVtLm91dC5wcmludGxuKCJcbj09PT09PT09cGx1Z2luIElEcyBhbmQgVmVyc2lvbnMgaW4gIiArIAotLy8JCQllY2xpcHNlUGx1Z2luUm9vdEZvbGRlcnNbaV0gKyAiPT09PT09PT0iKTsKLS8vCQkJVmVjdG9yIHBsdWdpbkRhdGFPYmpzICA9IAotLy8JCQlnZXRQbHVnaW5EYXRhRm9yQWxsUGx1Z2lucygKLS8vCQkJCWVjbGlwc2VQbHVnaW5Sb290Rm9sZGVyc1tpXS50b1N0cmluZygpKTsKLS8vCQkJdmVjdG9yc0luVGhpc1ZlY3Rvci5hZGQocGx1Z2luRGF0YU9ianMpOwotLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4ocGx1Z2luRGF0YU9ianMpOwotLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxuPT09PT09PT09PT18fHw9PT0gZW5kID09PXx8fD09PT09PT09PT09Iik7Ci0vLwkJfQotLy8JCQotLy8JCVZlY3RvciBwbHVnaW5EYXRhID0gbmV3IFZlY3RvcigpOwotLy8JCUl0ZXJhdG9yIG91dGVySXRlcmF0b3IgPSB2ZWN0b3JzSW5UaGlzVmVjdG9yLml0ZXJhdG9yKCk7Ci0vLwkJd2hpbGUob3V0ZXJJdGVyYXRvci5oYXNOZXh0KCkpewotLy8JCQlWZWN0b3IgcGx1Z2luRGF0YU9ianMgPSAoVmVjdG9yKW91dGVySXRlcmF0b3IubmV4dCgpOwotLy8JCQlJdGVyYXRvciBpbm5lckl0ZXJhdG9yID0gcGx1Z2luRGF0YU9ianMuaXRlcmF0b3IoKTsKLS8vCQkJd2hpbGUoaW5uZXJJdGVyYXRvci5oYXNOZXh0KCkpewotLy8JCQkJUGx1Z2luRGF0YSBwZCA9IChQbHVnaW5EYXRhKWlubmVySXRlcmF0b3IubmV4dCgpOwotLy8JCQkJU3RyaW5nIHBsdWdpbklkS2V5ID0gcGQuZ2V0UGx1Z2luSUQoKTsKLS8vCQkJCVN0cmluZyB2ZXJzaW9uVmFsdWUgPSBwZC5nZXRQbHVnaW5WZXJzaW9uKCk7Ci0vLwkJCQlTdHJpbmcgcGx1Z2luUGF0aCA9IHBkLmdldFBsdWdpbkxvY2F0aW9uKCk7Ci0vLwkJCQlwbHVnaW5EYXRhLmFkZChwZCk7Ci0vLwkJCX0KLS8vCQl9Ci0vLwkJCi0vLwkJaW50IGJyZWFrcG9pbnQ9MDsKLS8vCi0vLwkJcmV0dXJuIHBsdWdpbkRhdGE7Ci0vLwl9Ci0vLwotLy8KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jcmVhdGlvbi9jb3JlL3V0aWxzL1NlcnZpY2VYTUxDcmVhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY3JlYXRpb24vY29yZS91dGlscy9TZXJ2aWNlWE1MQ3JlYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTI3ZTBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jcmVhdGlvbi9jb3JlL3V0aWxzL1NlcnZpY2VYTUxDcmVhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IFdTTzIgSW5jLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBXU08yIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzAxMTAgICAxNjg3NjIgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgSW5pdGlhbCBjb2RlIHRvIGludHJvZHVzZSB0aGUgQXhpczIgCi0gKiAJCQkJCQkJCQkJICBydW50aW1lIHRvIHRoZSBmcmFtZXdvcmsgZm9yIDE2ODc2MgotICogMjAwNzA2MjAgICAxOTM0NDEgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgZml4IGZvciB0aGUgZGlzY3JpcHRpb24gbm90IGF0dGFjaCB0byBzZXJ2aWNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUudXRpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1wdWJsaWMgY2xhc3MgU2VydmljZVhNTENyZWF0b3IgewotICAgIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VDbGFzczsKLSAgICBwcml2YXRlIEFycmF5TGlzdCBvcGVyYXRpb25zOwotCi0gICAgcHVibGljIFNlcnZpY2VYTUxDcmVhdG9yKFN0cmluZyBzZXJ2aWNlTmFtZSwgU3RyaW5nIHNlcnZpY2VDbGFzcywgQXJyYXlMaXN0IG9wZXJhdGlvbnMpIHsKLSAgICAgICAgdGhpcy5zZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lOwotICAgICAgICB0aGlzLnNlcnZpY2VDbGFzcyA9IHNlcnZpY2VDbGFzczsKLSAgICAgICAgdGhpcy5vcGVyYXRpb25zID0gb3BlcmF0aW9uczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VOYW1lKCkgewotICAgICAgICByZXR1cm4gc2VydmljZU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlQ2xhc3MoKSB7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlQ2xhc3M7Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdCBnZXRPcGVyYXRpb25zKCkgewotICAgICAgICByZXR1cm4gb3BlcmF0aW9uczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmcgc2VydmljZVhNTCA9ICI8c2VydmljZSBuYW1lPVwiIiArIHNlcnZpY2VOYW1lICsgIlwiID5cbiIgKwotICAgICAgICAiXHQ8RGVzY3JpcHRpb24+XG4iICsKLSAgICAgICAgIlx0XHRQbGVhc2UgVHlwZSB5b3VyIHNlcnZpY2UgZGVzY3JpcHRpb24gaGVyZVxuIiArCi0gICAgICAgICJcdDwvRGVzY3JpcHRpb24+XG4iICsKLSAgICAgICAgIlx0PG1lc3NhZ2VSZWNlaXZlcnM+XG4iICsKLSAgICAgICAgIlx0XHQ8bWVzc2FnZVJlY2VpdmVyIG1lcD1cImh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vbmx5XCIgIiArCi0gICAgICAgICJjbGFzcz1cIm9yZy5hcGFjaGUuYXhpczIucnBjLnJlY2VpdmVycy5SUENJbk9ubHlNZXNzYWdlUmVjZWl2ZXJcIiAvPlxuIiArCi0gICAgICAgICJcdFx0PG1lc3NhZ2VSZWNlaXZlciAgbWVwPVwiaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW91dFwiICAiICsKLSAgICAgICAgImNsYXNzPVwib3JnLmFwYWNoZS5heGlzMi5ycGMucmVjZWl2ZXJzLlJQQ01lc3NhZ2VSZWNlaXZlclwiLz5cbiIgKwotICAgICAgICAiXHQ8L21lc3NhZ2VSZWNlaXZlcnM+XG4iICsgCi0gICAgICAgICJcdDxwYXJhbWV0ZXIgbmFtZT1cIlNlcnZpY2VDbGFzc1wiIGxvY2tlZD1cImZhbHNlXCI+IiArIHNlcnZpY2VDbGFzcyArICI8L3BhcmFtZXRlcj5cbiIgOyAKLSAgICAgICAgc2VydmljZVhNTCA9IHNlcnZpY2VYTUwgKyAiPC9zZXJ2aWNlPlxuIjsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2VYTUw7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24udWkvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNGU4NjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24udWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi51aS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24udWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ5OTI2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1idWlsZC54bWwKLWphdmFDb21waWxlci4uLmFyZ3MKLUBkb3QKLW9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi51aV8xLjAuMTAyLjIwMDgwNDAyMDIwNC5qYXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLnVpLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24udWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0ODQ2MmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24udWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24udWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODE2MTdkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSNTdW4gTWF5IDA2IDE3OjMzOjUzIExLVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2OGMzOTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlUExVR0lOX05BTUUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi51aTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMTAyLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMyLmNyZWF0aW9uLnVpLnBsdWdpbi5XZWJTZXJ2aWNlQXhpczJDcmVhdGlvblVJUGx1Z2luCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLAotIG9yZy5lY2xpcHNlLndzdC53cywKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLAotIG9yZy5lY2xpcHNlLmVtZi5jb21tb24sCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlLAotIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLAotIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi51aSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MudWkKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMyLmNyZWF0aW9uLnVpLndpZGdldHMuYmVhbiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpczIuY3JlYXRpb24udWkud2lkZ2V0cy5za2VsZXRvbiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpczIuY3JlYXRpb24udWkud3NydAotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1CdW5kbGUtVmVuZG9yOiAlUExVR0lOX1BST1ZJREVSCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi51aS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24udWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU3M2JkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi51aS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24udWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMxM2ExZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMgYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBXU08yIEluYyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotIyAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyAyMDA3MDEzMCAgIDE2ODc2MiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbml0aWFsIGNvZGUgdG8gaW50cm9kdXNlIHRoZQotIwkJCQkJCQkJCQkgQXhpczIgcnVudGltZSB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjIKLSMgMjAwNzA1MDIgICAxODQzMDIgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgRml4IGNvcHlyaWdodCBmb3IgQXhpczIgcGx1Z2lucwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24udWkvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjExODMzNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IFdTTzIgSW5jLiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotIyAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyAyMDA3MDUwMSAgIDE4NDYxNyBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBQcm92aWRlIHBsdWdpbiBkZXRhaWxzCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMKLSMgTWVzc2FnZXMgaW4gcGx1Z2luLnhtbC4KLSMKLVBMVUdJTl9OQU1FPVdlYnNlcnZpY2UgQXhpczIgQ3JlYXRpb24gVUkgUGx1Zy1pbgotUExVR0lOX1BST1ZJREVSPVdTTzIKLQotTEFCRUxfUlVOVElNRV9BWElTXzI9QXBhY2hlIEF4aXMyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi51aS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24udWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAwNGQ1OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0UmVnaXN0cnkiPgotICAgICAgPHdpZGdldEZhY3RvcnkgICAKLSAgICAgICAgaWQ9IkJlYW5FeGFtcGxlQ29uZmlnIgotICAgICAgICBpbnNlcnRCZWZvcmVDb21tYW5kSWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLmNvbW1hbmQuQXhpczJCVUNvbW1hbmQiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpczIuY3JlYXRpb24udWkud3NydC5BeGlzMkJlYW5Db25maWdXaWRnZXRGYWN0b3J5Ii8+Ci0gICAgPC9leHRlbnNpb24+IAotICAgIAotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRSZWdpc3RyeSI+Ci0gICAgICA8d2lkZ2V0RmFjdG9yeSAgIAotICAgICAgICBpZD0iU2tlbEV4YW1wbGVDb25maWciCi0gICAgICAgIGluc2VydEJlZm9yZUNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUuY29tbWFuZC5BeGlzMlREQ29tbWFuZCIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzMi5jcmVhdGlvbi51aS53c3J0LkF4aXMyU2tlbENvbmZpZ1dpZGdldEZhY3RvcnkiIC8+Ci0gICAgPC9leHRlbnNpb24+IAotICAgIAotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5ydW50aW1lcyI+Ci0gICAgICA8cnVudGltZQotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmF4aXMyV2ViU2VydmljZVJUIgotICAgICAgICBsYWJlbD0iJUxBQkVMX1JVTlRJTUVfQVhJU18yIgotICAgICAgICBzZXJ2ZXJSZXF1aXJlZD0iZmFsc2UiLz4KLSAgICA8L2V4dGVuc2lvbj4KLQotCi0JPCEtLSBkZWZpbmUgc3VwcG9ydCBmb3IgQXhpczIgSmF2YSBiZWFuIGJvdHRvbSB1cCBhbmQgdG9wLWRvd24gc3VwcG9ydCBpbiB3ZWIgcHJvamVjdHMgLS0+Ci0gICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLnNlcnZpY2VSdW50aW1lcyI+Ci0gICAgICA8c2VydmljZVJ1bnRpbWUKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5qYXZhIiAKLSAgICAgICAgc2VydmljZUltcGxlbWVudGF0aW9uVHlwZUlkPSJvcmcuZWNsaXBzZS5qc3Qud3Mud3NJbXBsLmphdmEiCi0gICAgICAgIHJ1bnRpbWVJZD0ib3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmF4aXMyV2ViU2VydmljZVJUIgotICAgICAgICBib3R0b21VcD0idHJ1ZSIKLSAgICAgICAgdG9wRG93bj0idHJ1ZSIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzMi5jcmVhdGlvbi51aS53c3J0LkF4aXMyV2ViU2VydmljZVJ1bnRpbWUiPgotCi0gICAgICAgIDxyZXF1aXJlZC1mYWNldC12ZXJzaW9uIGZhY2V0PSJqc3Qud2ViIiB2ZXJzaW9uPSIyLjMiIGFsbG93LW5ld2VyPSJ0cnVlIi8+Ci0gICAgICAgIDxyZXF1aXJlZC1mYWNldC12ZXJzaW9uIGZhY2V0PSJheGlzMi5jb3JlIiB2ZXJzaW9uPSIxLjEiIGFsbG93LW5ld2VyPSJ0cnVlIiAvPgotICAgICAgICA8cmVxdWlyZWQtZmFjZXQtdmVyc2lvbiBmYWNldD0iYXhpczIuZXh0IiB2ZXJzaW9uPSIxLjEiIGFsbG93LW5ld2VyPSJ0cnVlIiAvPgotCi0gICAgICA8L3NlcnZpY2VSdW50aW1lPgotICAgIDwvZXh0ZW5zaW9uPiAgIAotICAgICAgICAKLSAgICA8IS0tIGRlZmluZSBzdXBwb3J0IGZvciBBeGlzIEphdmEgY2xpZW50cyBpbiBXZWIgcHJvamVjdHMgLS0+Ci0gICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLmNsaWVudFJ1bnRpbWVzIj4KLSAgICAgIDxjbGllbnRSdW50aW1lCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24ud2ViIgotICAgICAgICBjbGllbnRJbXBsZW1lbnRhdGlvblR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LndzLmNsaWVudC50eXBlLmphdmEiCi0gICAgICAgIHJ1bnRpbWVJZD0ib3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmF4aXMyV2ViU2VydmljZVJUIgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMyLmNyZWF0aW9uLnVpLndzcnQuQXhpczJXZWJTZXJ2aWNlUnVudGltZSI+Ci0KLSAgICAgICAgPHJlcXVpcmVkLWZhY2V0LXZlcnNpb24gZmFjZXQ9ImpzdC53ZWIiIHZlcnNpb249IjIuMyIgYWxsb3ctbmV3ZXI9InRydWUiIC8+Ci0gICAgICAgIDxyZXF1aXJlZC1mYWNldC12ZXJzaW9uIGZhY2V0PSJheGlzMi5jb3JlIiB2ZXJzaW9uPSIxLjEiIGFsbG93LW5ld2VyPSJ0cnVlIiAvPgotICAgICAgICA8cmVxdWlyZWQtZmFjZXQtdmVyc2lvbiBmYWNldD0iYXhpczIuZXh0IiB2ZXJzaW9uPSIxLjEiIGFsbG93LW5ld2VyPSJ0cnVlIiAvPgotCi0gICAgICA8L2NsaWVudFJ1bnRpbWU+Ci0gICAgPC9leHRlbnNpb24+ICAgICAKLSAgICAKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzMi9jcmVhdGlvbi91aS9wbHVnaW4vV2ViU2VydmljZUF4aXMyQ3JlYXRpb25VSVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzMi9jcmVhdGlvbi91aS9wbHVnaW4vV2ViU2VydmljZUF4aXMyQ3JlYXRpb25VSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWJlNmY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpczIvY3JlYXRpb24vdWkvcGx1Z2luL1dlYlNlcnZpY2VBeGlzMkNyZWF0aW9uVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDExMCAgIDE2ODc2MiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbml0aWFsIGNvZGUgdG8gaW50cm9kdXNlIHRoZSBBeGlzMiAKLSAqIAkJCQkJCQkJCQkgIHJ1bnRpbWUgdG8gdGhlIGZyYW1ld29yayBmb3IgMTY4NzYyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMyLmNyZWF0aW9uLnVpLnBsdWdpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZUF4aXMyQ3JlYXRpb25VSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCi0JLy8gVGhlIHBsdWctaW4gSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLnVpIjsKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBXZWJTZXJ2aWNlQXhpczJDcmVhdGlvblVJUGx1Z2luIHBsdWdpbjsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgV2ViU2VydmljZUF4aXMyQ3JlYXRpb25VSVBsdWdpbigpIHsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBXZWJTZXJ2aWNlQXhpczJDcmVhdGlvblVJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMyL2NyZWF0aW9uL3VpL3dpZGdldHMvYmVhbi9TZXJ2aWNlc1hNTFNlbGVjdEJlYW5XaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpczIvY3JlYXRpb24vdWkvd2lkZ2V0cy9iZWFuL1NlcnZpY2VzWE1MU2VsZWN0QmVhbldpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmQ3MjNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpczIvY3JlYXRpb24vdWkvd2lkZ2V0cy9iZWFuL1NlcnZpY2VzWE1MU2VsZWN0QmVhbldpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDExMCAgIDE2ODc2MiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbml0aWFsIGNvZGUgdG8gaW50cm9kdXNlIHRoZSBBeGlzMiAKLSAqIAkJCQkJCQkJCQkgIHJ1bnRpbWUgdG8gdGhlIGZyYW1ld29yayBmb3IgMTY4NzYyCi0gKiAyMDA3MDUxMyAgIDE4NjQzMCBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBmaXggZm9yIDE4NjQzMAotICoJCQkJCQkJCQkJICBUZXh0IG5vdCBhY2Nlc3NpYmxlIG9uIEFYSVMyIHdpemFyZCBwYWdlcy4KLSAqIDIwMDcwNTI5ICAgMTg4NzQyIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIGZpeCBmb3IgMTg4NzQyCi0gKiAyMDA3MDgyNCAgIDIwMDUxNSBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBOT04tTkxTIG1vdmUgdG8gc2VwZXJhdGUgZmlsZQotICogMjAwNzEwMzAJICAyMDc2MjEgemluYUBjYS5pYm0uY29tIC0gWmluYSBNb3N0YWZpYSwgUGFnZSBHVUkgc2VxdWVuY2UgdXNpbmcgdGFiIGlzIG5vdCBjb3JyZWN0ICggdmlvbGF0ZXMgQWNjZXNzaWJpbGl0eSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpczIuY3JlYXRpb24udWkud2lkZ2V0cy5iZWFuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5jb25zdGFudC5BeGlzMkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS5kYXRhLkRhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS5tZXNzYWdlcy5BeGlzMkNyZWF0aW9uVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpczIuY29uc3VtcHRpb24udWkucGx1Z2luLldlYlNlcnZpY2VBeGlzMkNvbnN1bXB0aW9uVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmNvbW1vbi5VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotCi0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlc1hNTFNlbGVjdEJlYW5XaWRnZXQgZXh0ZW5kcyBTaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3IgCi17Ci0JcHJpdmF0ZSBEYXRhTW9kZWwgCW1vZGVsOwotCXByaXZhdGUgQnV0dG9uCSAJYnJvd3NlQnV0dG9uOwotCXByaXZhdGUgVGV4dCAJCXNlcnZpY2VzWE1MUGF0aDsKLQlwcml2YXRlIEJ1dHRvbiAJCWdlbmVyYXRlU2VydmljZXNYTUw7Ci0JcHJpdmF0ZSBCdXR0b24gCQloYXZlU2VydmljZXNYTUw7Ci0KLQlwdWJsaWMgU2VydmljZXNYTUxTZWxlY3RCZWFuV2lkZ2V0KCBEYXRhTW9kZWwgbW9kZWwgKQotCXsKLQkJdGhpcy5tb2RlbCA9IG1vZGVsOyAgCi0JfQotCi0JcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoIENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyICkKLQl7Ci0JCVVJVXRpbHMgdWlVdGlscyA9IG5ldyBVSVV0aWxzKFdlYlNlcnZpY2VBeGlzMkNvbnN1bXB0aW9uVUlQbHVnaW4uUExVR0lOX0lEKTsKLQkJCi0JCVRleHQgbGFiZWwgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5SRUFEX09OTFkpOwotCQlsYWJlbC5zZXRUZXh0KCBBeGlzMkNyZWF0aW9uVUlNZXNzYWdlcy5MQUJFTF9BWElTMl9QUkVGRVJFTkNFX1BBR0UgKTsKLQkJCi0JCW1vZGVsLnNldEdlbmVyYXRlU2VydmljZXNYTUwodHJ1ZSk7Ci0JCW1vZGVsLnNldFNlcnZpY2VzWE1MKGZhbHNlKTsKLQotCQlmaW5hbCBDb21wb3NpdGUgcmFkaW9Db21wID0gdWlVdGlscy5jcmVhdGVDb21wb3NpdGUocGFyZW50LCAxKTsKLQkJCi0JCWhhdmVTZXJ2aWNlc1hNTCA9IHVpVXRpbHMuY3JlYXRlUmFkaW9CdXR0b24ocmFkaW9Db21wLCBBeGlzMkNyZWF0aW9uVUlNZXNzYWdlcy5MQUJFTF9IQVZFX1NFUlZJQ0VTX1hNTF9GSUxFLCBudWxsLCBudWxsICk7Ci0JCWhhdmVTZXJ2aWNlc1hNTC5hZGRTZWxlY3Rpb25MaXN0ZW5lciggbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotCQl7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotCQkJewotCQkJCWlmIChoYXZlU2VydmljZXNYTUwuZ2V0U2VsZWN0aW9uKCkpewotCQkJCQloYXZlU2VydmljZXNYTUwuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCQlnZW5lcmF0ZVNlcnZpY2VzWE1MLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQkJCWVuYWJsZVNlcnZpY2VzWE1MQnJvd3NlKCk7Ci0JCQkJfWVsc2V7Ci0JCQkJCWlmICghZ2VuZXJhdGVTZXJ2aWNlc1hNTC5nZXRTZWxlY3Rpb24oKSl7Ci0JCQkJCQloYXZlU2VydmljZXNYTUwuc2V0U2VsZWN0aW9uKHRydWUpOyAKLQkJCQkJCWdlbmVyYXRlU2VydmljZXNYTUwuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCQkJCWVuYWJsZVNlcnZpY2VzWE1MQnJvd3NlKCk7Ci0JCQkJCX1lbHNlewotCQkJCQkJaGF2ZVNlcnZpY2VzWE1MLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQkJCQlkaXNhYmxlU2VydmljZXNYTUxCcm93c2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQltb2RlbC5zZXRHZW5lcmF0ZVNlcnZpY2VzWE1MKGZhbHNlKTsKLQkJCQltb2RlbC5zZXRTZXJ2aWNlc1hNTCh0cnVlKTsKLQotCQkJCS8vIE5lZWQgdG8gdHJpZ2dlciBhIHZhbGlkYXRpb24gYXQgdGhpcyBwb2ludCB0byBlbnN1cmUKLQkJCQkvLyB0aGF0IHRoZSBuZXh0IGJ1dHRvbiBpcyBlbmFibGVkIHByb3Blcmx5IGp1c3QgaW4gY2FzZQotCQkJCS8vIHRoaXMgaXMgdGhlIGxhc3QgcGFnZSBpbiB0aGUgd2l6YXJkLgotCQkJCXN0YXR1c0xpc3RlbmVyLmhhbmRsZUV2ZW50KCBudWxsICk7Ci0JCQl9ICAgICAKLQkJfSk7Ci0JCQotCQlmaW5hbCBDb21wb3NpdGUgcGF0aENvbXAgPSB1aVV0aWxzLmNyZWF0ZUNvbXBvc2l0ZShyYWRpb0NvbXAsIDMpOwotCQlzZXJ2aWNlc1hNTFBhdGggPSB1aVV0aWxzLmNyZWF0ZVRleHQocGF0aENvbXAsICIiLCBudWxsLCBudWxsLCBTV1QuQk9SREVSICk7Ci0JCXNlcnZpY2VzWE1MUGF0aC5hZGRNb2RpZnlMaXN0ZW5lciggbmV3IE1vZGlmeUxpc3RlbmVyKCkKLQkJewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKQotCQkJewotCQkJCW1vZGVsLnNldFBhdGhUb1NlcnZpY2VzWE1MKCBzZXJ2aWNlc1hNTFBhdGguZ2V0VGV4dCgpICk7Ci0JCQkJLy8gTmVlZCB0byB0cmlnZ2VyIGEgdmFsaWRhdGlvbiBhdCB0aGlzIHBvaW50IHRvIGVuc3VyZQotCQkJCS8vIHRoYXQgdGhlIG5leHQgYnV0dG9uIGlzIGVuYWJsZWQgcHJvcGVybHkganVzdCBpbiBjYXNlCi0JCQkJLy8gdGhpcyBpcyB0aGUgbGFzdCBwYWdlIGluIHRoZSB3aXphcmQuCi0JCQkJc3RhdHVzTGlzdGVuZXIuaGFuZGxlRXZlbnQoIG51bGwgKTsKLQkJCX0KLQkJfSk7Ci0KLQkJCi0JCWJyb3dzZUJ1dHRvbiA9IHVpVXRpbHMuY3JlYXRlUHVzaEJ1dHRvbihwYXRoQ29tcCwgQXhpczJDcmVhdGlvblVJTWVzc2FnZXMuTEFCRUxfQlJPV1NFLCBudWxsLCBudWxsICk7Ci0JCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciggbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotCQl7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotCQkJewotCQkJCWhhbmRsZUJyb3dzZShwYXRoQ29tcC5nZXRTaGVsbCgpKTsKLQkJCQkvLyBOZWVkIHRvIHRyaWdnZXIgYSB2YWxpZGF0aW9uIGF0IHRoaXMgcG9pbnQgdG8gZW5zdXJlCi0JCQkJLy8gdGhhdCB0aGUgbmV4dCBidXR0b24gaXMgZW5hYmxlZCBwcm9wZXJseSBqdXN0IGluIGNhc2UKLQkJCQkvLyB0aGlzIGlzIHRoZSBsYXN0IHBhZ2UgaW4gdGhlIHdpemFyZC4KLQkJCQlzdGF0dXNMaXN0ZW5lci5oYW5kbGVFdmVudCggbnVsbCApOwotCQkJfSAgICAgCi0JCX0pOyAKLQotCi0JCWdlbmVyYXRlU2VydmljZXNYTUwgPSB1aVV0aWxzLmNyZWF0ZVJhZGlvQnV0dG9uKHJhZGlvQ29tcCwgQXhpczJDcmVhdGlvblVJTWVzc2FnZXMuTEFCRUxfREVGQVVMVF9TRVJWSUNFU19YTUxfRklMRSwgbnVsbCwgbnVsbCk7Ci0JCWdlbmVyYXRlU2VydmljZXNYTUwuc2V0U2VsZWN0aW9uKHRydWUpOwotCQlnZW5lcmF0ZVNlcnZpY2VzWE1MLmFkZFNlbGVjdGlvbkxpc3RlbmVyKCBuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0JCXsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0JCQl7Ci0JCQkJaWYgKGdlbmVyYXRlU2VydmljZXNYTUwuZ2V0U2VsZWN0aW9uKCkpewotCQkJCQlnZW5lcmF0ZVNlcnZpY2VzWE1MLnNldFNlbGVjdGlvbih0cnVlKTsgCi0JCQkJCWhhdmVTZXJ2aWNlc1hNTC5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCQlkaXNhYmxlU2VydmljZXNYTUxCcm93c2UoKTsKLQkJCQl9ZWxzZXsKLQkJCQkJaWYgKCFoYXZlU2VydmljZXNYTUwuZ2V0U2VsZWN0aW9uKCkpewotCQkJCQkJZ2VuZXJhdGVTZXJ2aWNlc1hNTC5zZXRTZWxlY3Rpb24odHJ1ZSk7IAotCQkJCQkJaGF2ZVNlcnZpY2VzWE1MLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQkJCX1lbHNlewotCQkJCQkJZ2VuZXJhdGVTZXJ2aWNlc1hNTC5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJCW1vZGVsLnNldEdlbmVyYXRlU2VydmljZXNYTUwodHJ1ZSk7Ci0JCQkJbW9kZWwuc2V0U2VydmljZXNYTUwoZmFsc2UpOwotCQkJCS8vIE5lZWQgdG8gdHJpZ2dlciBhIHZhbGlkYXRpb24gYXQgdGhpcyBwb2ludCB0byBlbnN1cmUKLQkJCQkvLyB0aGF0IHRoZSBuZXh0IGJ1dHRvbiBpcyBlbmFibGVkIHByb3Blcmx5IGp1c3QgaW4gY2FzZQotCQkJCS8vIHRoaXMgaXMgdGhlIGxhc3QgcGFnZSBpbiB0aGUgd2l6YXJkLgotCQkJCXN0YXR1c0xpc3RlbmVyLmhhbmRsZUV2ZW50KCBudWxsICk7Ci0JCQl9ICAgICAKLQkJfSk7IAotCi0JCWRpc2FibGVTZXJ2aWNlc1hNTEJyb3dzZSgpOwotCi0JCXJldHVybiB0aGlzOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yI2dldFN0YXR1cygpCi0JICovCi0JcHVibGljIElTdGF0dXMgZ2V0U3RhdHVzKCkgCi0JewotCQlJU3RhdHVzIHJlc3VsdCA9IG51bGw7Ci0KLQkJaWYoIGhhdmVTZXJ2aWNlc1hNTC5nZXRTZWxlY3Rpb24oKSAmJiBzZXJ2aWNlc1hNTFBhdGguZ2V0VGV4dCgpLmVxdWFscygiIikgKQotCQl7Ci0JCQlyZXN1bHQgPSBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCAKLQkJCQkJCQkJImlkIiwgCi0JCQkJCQkJCTAsIAotCQkJCQkJCQlBeGlzMkNyZWF0aW9uVUlNZXNzYWdlcy5FUlJPUl9JTlZBTElEX1NFUlZJQ0VTX1hNTCwgCi0JCQkJCQkJCW51bGwgKTsgCi0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIGVuYWJsZSB0aGUgc2VydmljZXMueG1sIHRleHQgYW5kIGJyb3dzZSBidXR0b24KLQkgKi8KLQlwcml2YXRlIHZvaWQgZW5hYmxlU2VydmljZXNYTUxCcm93c2UoKXsKLQkJYnJvd3NlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXNlcnZpY2VzWE1MUGF0aC5zZXRFbmFibGVkKHRydWUpOwotCX0KLQotCS8qKgotCSAqIGRpc2FibGUgdGhlIHNlcnZpY2VzLnhtbCB0ZXh0IGFuZCBicm93c2UgYnV0dG9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRpc2FibGVTZXJ2aWNlc1hNTEJyb3dzZSgpewotCQlicm93c2VCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXNlcnZpY2VzWE1MUGF0aC5zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBQb3BzIHVwIHRoZSBmaWxlIGJyb3dzZSBkaWFsb2cgYm94Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUJyb3dzZShTaGVsbCBwYXJlbnQpIHsKLQkJRmlsZURpYWxvZyBmaWxlRGlhbG9nID0gbmV3IEZpbGVEaWFsb2cocGFyZW50KTsKLQkJZmlsZURpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7IEF4aXMyQ29uc3RhbnRzLkZJTEVfWE1MIH0pOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBmaWxlRGlhbG9nLm9wZW4oKTsKLQkJaWYgKGZpbGVOYW1lICE9IG51bGwpIHsKLQkJCXNlcnZpY2VzWE1MUGF0aC5zZXRUZXh0KGZpbGVOYW1lKTsKLQkJCW1vZGVsLnNldFBhdGhUb1NlcnZpY2VzWE1MKCBzZXJ2aWNlc1hNTFBhdGguZ2V0VGV4dCgpICk7Ci0JCX0KLQl9Ci19Ci0KLQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMyL2NyZWF0aW9uL3VpL3dpZGdldHMvc2tlbGV0b24vV1NETDJKQVZBU2tlbENvbmZpZ1dpZGdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzMi9jcmVhdGlvbi91aS93aWRnZXRzL3NrZWxldG9uL1dTREwySkFWQVNrZWxDb25maWdXaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQwMTczNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMyL2NyZWF0aW9uL3VpL3dpZGdldHMvc2tlbGV0b24vV1NETDJKQVZBU2tlbENvbmZpZ1dpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDExMCAgIDE2ODc2MiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbml0aWFsIGNvZGUgdG8gaW50cm9kdXNlIHRoZSBBeGlzMiAKLSAqIAkJCQkJCQkJCQkgIHJ1bnRpbWUgdG8gdGhlIGZyYW1ld29yayBmb3IgMTY4NzYyCi0gKiAyMDA3MDQyNSAgIDE4MzA0NiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoCi0gKiAyMDA3MDUxOCAgIDE4NzMxMSBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBGaXhpbmcgdGVzdCByZXNvdXJjZSBhZGRpdGlvbgotICogMjAwNzA1MjMgICAxNzQ4NzYgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgUGVyc2lzdCBQcmVmZXJlbmNlcyBpbnNpZGUgRnJhbWV3b3JrCi0gKiAyMDA3MDgyMyAgIDIwMDQxMyBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBOYW1lc3BhY2UgdG8gUGFja2FnZSB0YWJsZSBmaXgKLSAqIDIwMDcwODI0ICAgMjAwNTE1IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIE5PTi1OTFMgbW92ZSB0byBzZXBlcmF0ZSBmaWxlCi0gKiAyMDA4MDMxOSAgIDIwNzYxNiBtYWthbmRyZUBjYS5pYm0uY29tIC0gQW5kcmV3IE1haywgVGFibGUgaW4gQXhpczIgV2ViIFNlcnZpY2UgU2tlbGV0b24gSmF2YSBCZWFuIENvbmZpZ3VyYXRpb24gUGFnZSBub3QgQWNjZXNzaWJsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzMi5jcmVhdGlvbi51aS53aWRnZXRzLnNrZWxldG9uOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLnV0aWxzLldTRExQcm9wZXJ0eVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5jb25zdGFudC5BeGlzMkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5jb250ZXh0LkF4aXMyRW1pdHRlckNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUucGx1Z2luLldlYlNlcnZpY2VBeGlzMkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUudXRpbHMuQ2xhc3NMb2FkaW5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS5kYXRhLkRhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS5tZXNzYWdlcy5BeGlzMkNyZWF0aW9uVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UYWJsZUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1c1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotCi0KLXB1YmxpYyBjbGFzcyBXU0RMMkpBVkFTa2VsQ29uZmlnV2lkZ2V0IGV4dGVuZHMgU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yIAotewotCXByaXZhdGUgRGF0YU1vZGVsIG1vZGVsOwotCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQotCS8vY29udHJvbHMKLQkvL2NoZWNrIGJveCBmb3Igc2VydmVyIHNpZGUgaW50ZXJmYWNlCi0JcHJpdmF0ZSBCdXR0b24gZ2VuZXJhdGVTZXJ2ZXJTaWRlSW50ZXJmYWNlQ2hlY2tCb3hCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gZ2VuZXJhdGVBbGxDaGVja0JveEJ1dHRvbjsKLQlwcml2YXRlIENvbWJvIGRhdGFiaW5kaW5nVHlwZUNvbWJvOwotCS8vIFRleHQgYm94IHRvIGhhdmUgdGhlIHBvcnRuYW1lCi0JcHJpdmF0ZSBDb21ibyBwb3J0TmFtZUNvbWJvOwotCS8vVGV4dCBib3ggdG8gaGF2ZSB0aGUgc2VydmljZSBuYW1lCi0JcHJpdmF0ZSBDb21ibyBzZXJ2aWNlTmFtZUNvbWJvOwotCXByaXZhdGUgV1NETFByb3BlcnR5UmVhZGVyIHJlYWRlcjsKLQlwcml2YXRlIGphdmEudXRpbC5MaXN0IHNlcnZpY2VRTmFtZUxpc3QgPSBudWxsOwotCXByaXZhdGUgVGFibGUgbmFtZXNwYWNlMnBhY2thZ2VUYWJsZSA9IG51bGw7Ci0JLy9MYWJlbCBob2xkaW5nIHRoZSBmdWxsIHF1YWxpZmllZCBwYWNrYWdlIG5hbWUgZm9yIGdlbmVyYXRlZCBjb2RlCi0JcHJpdmF0ZSBUZXh0IHBhY2thZ2VUZXh0OwotCS8vQ2hlY2tib3ggdG8gZW5hYmxlIHRoZSBnZW5lcmF0aW9uIG9mIHRlc3QgY2FzZSBjbGFzc2VzIAotCS8vIGZvciB0aGUgZ2VuZXJhdGVkIGltcGxlbWVudGF0aW9uIG9mIHRoZSB3ZWJzZXJ2aWNlLgotCUxhYmVsICAgICAgbGFiZWwsIGZpbGxMYWJlbCwgZmlsbExhYmVsMSwgZmlsbExhYmVsMiwgZmlsbExhYmVsMywgZmlsbExhYmVsNCwgZmlsbExhYmVsNSwgZmlsbExhYmVsNjsKLQlBeGlzMkVtaXR0ZXJDb250ZXh0IGNvbnRleHQ7Ci0KLQlwdWJsaWMgV1NETDJKQVZBU2tlbENvbmZpZ1dpZGdldCggRGF0YU1vZGVsIG1vZGVsICkJewotCQljb250ZXh0ID0gV2ViU2VydmljZUF4aXMyQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QXhpc0VtaXR0ZXJDb250ZXh0KCk7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsgIAotCX0KLQotCXB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGFkZENvbnRyb2xzKCBDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lciApewotCQlDb21wb3NpdGUgIG1haW5Db21wID0gbmV3IENvbXBvc2l0ZSggcGFyZW50LCBTV1QuTk9ORSApOwotCQlHcmlkTGF5b3V0IGxheW91dCAgID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbWFpbkNvbXAuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQltYWluQ29tcC5zZXRMYXlvdXREYXRhKCBnZCApOwotCi0JCS8vIHNlcnZpY2UgbmFtZQotCQlsYWJlbCA9IG5ldyBMYWJlbChtYWluQ29tcCwgU1dULk5VTEwpOwotCQlsYWJlbC5zZXRUZXh0KEF4aXMyQ3JlYXRpb25VSU1lc3NhZ2VzLkxBQkVMX1NFUlZJQ0VfTkFNRV9DQVBUSU9OKTsKLQotCQlzZXJ2aWNlTmFtZUNvbWJvID0gbmV3IENvbWJvKG1haW5Db21wLCBTV1QuRFJPUF9ET1dOIHwgU1dULkJPUkRFUgotCQkJCXwgU1dULlJFQURfT05MWSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJc2VydmljZU5hbWVDb21iby5zZXRMYXlvdXREYXRhKGdkKTsKLQkJc2VydmljZU5hbWVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJbW9kZWwuc2V0U2VydmljZU5hbWUoc2VydmljZU5hbWVDb21iby5nZXRUZXh0KCkpOwotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gcG9ydCBuYW1lCi0JCWxhYmVsID0gbmV3IExhYmVsKG1haW5Db21wLCBTV1QuTlVMTCk7Ci0JCWxhYmVsLnNldFRleHQoQXhpczJDcmVhdGlvblVJTWVzc2FnZXMuTEFCRUxfUE9SVE5BTUUpOwotCQlwb3J0TmFtZUNvbWJvID0gbmV3IENvbWJvKG1haW5Db21wLCBTV1QuRFJPUF9ET1dOIHwgU1dULkJPUkRFUgotCQkJCXwgU1dULlJFQURfT05MWSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJcG9ydE5hbWVDb21iby5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcG9ydE5hbWVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJbW9kZWwuc2V0UG9ydE5hbWUocG9ydE5hbWVDb21iby5nZXRUZXh0KCkpOwotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gRGF0YWJpbmRpbmcKLQkJbGFiZWwgPSBuZXcgTGFiZWwobWFpbkNvbXAsIFNXVC5OVUxMKTsKLQkJbGFiZWwuc2V0VGV4dChBeGlzMkNyZWF0aW9uVUlNZXNzYWdlcy5MQUJFTF9EQVRBQklORElOR19DQVBUSU9OKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlkYXRhYmluZGluZ1R5cGVDb21ibyA9IG5ldyBDb21ibyhtYWluQ29tcCwgU1dULkRST1BfRE9XTiB8IFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJZGF0YWJpbmRpbmdUeXBlQ29tYm8uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWZpbGxEYXRhYmluZGVyQ29tYm8oKTsKLQkJZGF0YWJpbmRpbmdUeXBlQ29tYm8uc2VsZWN0KDApOwotCQlkYXRhYmluZGluZ1R5cGVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJbW9kZWwuc2V0RGF0YWJpbmRpbmdUeXBlKGRhdGFiaW5kaW5nVHlwZUNvbWJvLmdldFRleHQoKSk7Ci0JCQl9OwotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX07Ci0JCX0pOwotCi0JCS8vIHBhY2thZ2UgbmFtZQotCQlsYWJlbCA9IG5ldyBMYWJlbChtYWluQ29tcCwgU1dULk5VTEwpOwotCQlsYWJlbC5zZXRUZXh0KEF4aXMyQ3JlYXRpb25VSU1lc3NhZ2VzLkxBQkVMX1BBQ0tFR0VfTkFNRSk7Ci0JCXBhY2thZ2VUZXh0ID0gbmV3IFRleHQobWFpbkNvbXAsIFNXVC5CT1JERVIpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0KLQkJcGFja2FnZVRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXBhY2thZ2VUZXh0LnNldFRleHQoIiIpOyAvLyBnZXQgdGhpcyB0ZXh0IGZyb20gdGhlCi0JCXBhY2thZ2VUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCW1vZGVsLnNldFBhY2thZ2VUZXh0KHBhY2thZ2VUZXh0LmdldFRleHQoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vZmlsbGluZyBsYWJlbCAKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlmaWxsTGFiZWwgPSBuZXcgTGFiZWwobWFpbkNvbXAsIFNXVC5IT1JJWk9OVEFMIHwgU1dULk5VTEwpOwotCi0JCS8vZmlsbGluZyBsYWJlbCAKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlmaWxsTGFiZWwyID0gbmV3IExhYmVsKG1haW5Db21wLCBTV1QuSE9SSVpPTlRBTCB8IFNXVC5OVUxMKTsKLQotCQkvL2ZpbGxpbmcgbGFiZWwgCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJZmlsbExhYmVsMyA9IG5ldyBMYWJlbChtYWluQ29tcCwgU1dULkhPUklaT05UQUwgfCBTV1QuTlVMTCk7Ci0KLQkJLy9maWxsaW5nIGxhYmVsIAotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWZpbGxMYWJlbDQgPSBuZXcgTGFiZWwobWFpbkNvbXAsIFNXVC5IT1JJWk9OVEFMIHwgU1dULk5VTEwpOwotCi0JCW1vZGVsLnNldFNlcnZlclhNTENoZWNrKHRydWUpOwotCi0JCS8vdGhlIHNlcnZlciBzaWRlIGludGVyZmFjZSBvcHRpb24KLQkJZ2VuZXJhdGVTZXJ2ZXJTaWRlSW50ZXJmYWNlQ2hlY2tCb3hCdXR0b24gPSBuZXcgQnV0dG9uKG1haW5Db21wLCBTV1QuQ0hFQ0spOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWdlbmVyYXRlU2VydmVyU2lkZUludGVyZmFjZUNoZWNrQm94QnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQlnZW5lcmF0ZVNlcnZlclNpZGVJbnRlcmZhY2VDaGVja0JveEJ1dHRvbgotCQkJCQkJCS5zZXRTZWxlY3Rpb24oY29udGV4dC5pc1NlcnZpY2VJbnRlcmZhY2VTa2VsZXRvbigpKTsKLQkJZ2VuZXJhdGVTZXJ2ZXJTaWRlSW50ZXJmYWNlQ2hlY2tCb3hCdXR0b24uc2V0VGV4dChBeGlzMkNyZWF0aW9uVUlNZXNzYWdlcy4KLQkJCQkJCQkJCQkJCQkJICBMQUJFTF9HRU5FUkFURV9TRVJWRVJTSURFX0lOVEVSRkFDRSk7Ci0JCW1vZGVsLnNldEdlbmVyYXRlQWxsQ2hlY2soY29udGV4dC5pc1NlcnZpY2VJbnRlcmZhY2VTa2VsZXRvbigpKTsKLQkJZ2VuZXJhdGVTZXJ2ZXJTaWRlSW50ZXJmYWNlQ2hlY2tCb3hCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCW1vZGVsLnNldEdlbmVyYXRlU2VydmVyU2lkZUludGVyZmFjZSgKLQkJCQkJCWdlbmVyYXRlU2VydmVyU2lkZUludGVyZmFjZUNoZWNrQm94QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIGdlbmVyYXRlIGFsbAotCQlnZW5lcmF0ZUFsbENoZWNrQm94QnV0dG9uID0gbmV3IEJ1dHRvbihtYWluQ29tcCwgU1dULkNIRUNLKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlnZW5lcmF0ZUFsbENoZWNrQm94QnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQlnZW5lcmF0ZUFsbENoZWNrQm94QnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzU2VydmljZUdlbmVyYXRlQWxsKCkpOwotCQlnZW5lcmF0ZUFsbENoZWNrQm94QnV0dG9uLnNldFRleHQoQXhpczJDcmVhdGlvblVJTWVzc2FnZXMuTEFCRUxfR0VORVJBVEVfQUxMKTsKLQkJZ2VuZXJhdGVBbGxDaGVja0JveEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJbW9kZWwuc2V0R2VuZXJhdGVBbGxDaGVjayhnZW5lcmF0ZUFsbENoZWNrQm94QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJLy9maWxsaW5nIGxhYmVsIAotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWZpbGxMYWJlbDUgPSBuZXcgTGFiZWwobWFpbkNvbXAsIFNXVC5IT1JJWk9OVEFMIHwgU1dULk5VTEwpOwotCi0JCS8vZmlsbGluZyBsYWJlbCAKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlmaWxsTGFiZWw2ID0gbmV3IExhYmVsKG1haW5Db21wLCBTV1QuSE9SSVpPTlRBTCB8IFNXVC5OVUxMKTsKLQkJCi0JCS8vYWRkIGEgdGFibGUgdG8gc2V0IG5hbWVzcGFjZSB0byBwYWNrYWdlIG1hcHBpbmcKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICAgICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICBnZC52ZXJ0aWNhbFNwYW4gPSA1OwotICAgICAgICAKLSAgICAgICAgbmFtZXNwYWNlMnBhY2thZ2VUYWJsZSA9IG5ldyBUYWJsZShtYWluQ29tcCxTV1QuQk9SREVSfFNXVC5GVUxMX1NFTEVDVElPTik7Ci0gICAgICAgIG5hbWVzcGFjZTJwYWNrYWdlVGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotICAgICAgICBuYW1lc3BhY2UycGFja2FnZVRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7IAotICAgICAgICBuYW1lc3BhY2UycGFja2FnZVRhYmxlLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIG5hbWVzcGFjZTJwYWNrYWdlVGFibGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICAgCi0gICAgICAgIGRlY2xhcmVDb2x1bW4obmFtZXNwYWNlMnBhY2thZ2VUYWJsZSwKLSAgICAgICAgCQkzNTAsIC8vYSBkZWZhdWx0IHdpZHRoIHVudGlsIHdlIGFkanVzdAotICAgICAgICAJCUF4aXMyQ3JlYXRpb25VSU1lc3NhZ2VzLkxBQkVMX05BTUVTUEFDRSk7Ci0gICAgICAgIGRlY2xhcmVDb2x1bW4obmFtZXNwYWNlMnBhY2thZ2VUYWJsZSwKLSAgICAgICAgCQkyMDAsLy9hIGRlZmF1bHQgd2lkdGggdW50aWwgd2UgYWRqdXN0Ci0gICAgICAgIAkJQXhpczJDcmVhdGlvblVJTWVzc2FnZXMuTEFCRUxfUEFDS0FHRSk7Ci0gICAgICAgIAotICAgICAgICBuYW1lc3BhY2UycGFja2FnZVRhYmxlLnNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgIAotICAgICAgICAvLyBhZGQgdGhlIHRhYmxlIGVkaXRvcgotICAgICAgICBmaW5hbCBUYWJsZUVkaXRvciBlZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IobmFtZXNwYWNlMnBhY2thZ2VUYWJsZSk7Ci0gICAgICAgIGVkaXRvci5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkxFRlQ7Ci0gICAgICAgIGVkaXRvci5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0KLSAgICAgICAgbmFtZXNwYWNlMnBhY2thZ2VUYWJsZS5hZGRMaXN0ZW5lcihTV1QuTW91c2VEb3duLCBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotICAgICAgICAgICAgICBSZWN0YW5nbGUgY2xpZW50QXJlYSA9IG5hbWVzcGFjZTJwYWNrYWdlVGFibGUuZ2V0Q2xpZW50QXJlYSgpOwotICAgICAgICAgICAgICBQb2ludCBwdCA9IG5ldyBQb2ludChldmVudC54LCBldmVudC55KTsKLSAgICAgICAgICAgICAgaW50IGluZGV4ID0gbmFtZXNwYWNlMnBhY2thZ2VUYWJsZS5nZXRUb3BJbmRleCgpOwotICAgICAgICAgICAgICB3aGlsZSAoaW5kZXggPCBuYW1lc3BhY2UycGFja2FnZVRhYmxlLmdldEl0ZW1Db3VudCgpKSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiB2aXNpYmxlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgVGFibGVJdGVtIGl0ZW0gPSBuYW1lc3BhY2UycGFja2FnZVRhYmxlLmdldEl0ZW0oaW5kZXgpOwotICAgICAgICAgICAgICAgIFJlY3RhbmdsZSByZWN0ID0gaXRlbS5nZXRCb3VuZHMoMSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlY3QuY29udGFpbnMocHQpKSB7Ci0gICAgICAgICAgICAgICAgCWVkaXRDZWxsKGl0ZW0sIGVkaXRvcik7Ci0gICAgICAgICAgICAgICAgCXJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCF2aXNpYmxlICYmIHJlY3QuaW50ZXJzZWN0cyhjbGllbnRBcmVhKSkgewotICAgICAgICAgICAgICAgICAgICB2aXNpYmxlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCF2aXNpYmxlKQotICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9KTsKLSAgICAgICAgCi0gICAgICAgIG5hbWVzcGFjZTJwYWNrYWdlVGFibGUuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJaWYgKG5hbWVzcGFjZTJwYWNrYWdlVGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKSA9PSAtMSkKLQkJCQkJbmFtZXNwYWNlMnBhY2thZ2VUYWJsZS5zZXRTZWxlY3Rpb24oMCk7Ci0JCQl9Ci0gICAgICAgIH0pOwotICAgICAgICAKLSAgICAgICAgbmFtZXNwYWNlMnBhY2thZ2VUYWJsZS5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpIHsKLSAgICAgICAgCXB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgewotICAgICAgICAJCWlmIChlLmtleUNvZGUgIT0gMzIpCi0gICAgICAgIAkJCXJldHVybjsKLQkJCQkKLSAgICAgICAgCQlUYWJsZUl0ZW1bXSBpdGVtID0gbmFtZXNwYWNlMnBhY2thZ2VUYWJsZS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoaXRlbS5sZW5ndGggIT0gMSkKLQkJCQkJcmV0dXJuOwotCQkJCQotCQkJCWVkaXRDZWxsKGl0ZW1bMF0sIGVkaXRvcik7Ci0JCQl9Ci0gICAgICAgIH0pOwotICAgICAgICAKLQkJcG9wdWxhdGVQYXJhbXNGcm9tV1NETCgpOwotCQlwb3B1bGF0ZU1vZGVsKCk7Ci0KLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVkaXRDZWxsKGZpbmFsIFRhYmxlSXRlbSBpdGVtLCBUYWJsZUVkaXRvciBlZGl0b3IpIHsKLQkJCi0JCWZpbmFsIFRleHQgdGV4dEVkaXQgPSBuZXcgVGV4dChuYW1lc3BhY2UycGFja2FnZVRhYmxlLCBTV1QuTk9ORSk7CQkKLQkJdGV4dEVkaXQuc2V0VGV4dChpdGVtLmdldFRleHQoMSkpOwkJCQkJCQotCQl0ZXh0RWRpdC5zZWxlY3RBbGwoKTsKLQkJdGV4dEVkaXQuc2V0Rm9jdXMoKTsKLQkJCi0JCXRleHRFZGl0LmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQlpdGVtLnNldFRleHQoMSwgdGV4dEVkaXQuZ2V0VGV4dCgpKTsKLQkJCQl0ZXh0RWRpdC5kaXNwb3NlKCk7Ci0JCQl9CQkJCi0JCX0pOwotCQkKLQkJdGV4dEVkaXQuYWRkVHJhdmVyc2VMaXN0ZW5lcihuZXcgVHJhdmVyc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGtleVRyYXZlcnNlZChUcmF2ZXJzZUV2ZW50IGUpIHsKLQkJCQlzd2l0Y2ggKGUuZGV0YWlsKSB7Ci0JCQkJCWNhc2UgU1dULlRSQVZFUlNFX1JFVFVSTjoKLQkJCQkJCWl0ZW0uc2V0VGV4dCgxLCB0ZXh0RWRpdC5nZXRUZXh0KCkpOwotCQkJCQljYXNlIFNXVC5UUkFWRVJTRV9FU0NBUEU6Ci0JCQkJCQl0ZXh0RWRpdC5kaXNwb3NlKCk7Ci0JCQkJCQllLmRvaXQgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9CQkJCi0JCX0pOwotCQkKLQkJdGV4dEVkaXQuYWRkS2V5TGlzdGVuZXIobmV3IEtleUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLQkJCQlpZiAoZS5rZXlDb2RlID09IDMyKSB7Ci0JCQkJCWl0ZW0uc2V0VGV4dCgxLCB0ZXh0RWRpdC5nZXRUZXh0KCkpOwotCQkJCQl0ZXh0RWRpdC5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfQkJCQotCQl9KTsKLQkJCi0JCXRleHRFZGl0LmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKLQkJCQltb2RlbC5zZXROYW1lc3Bhc2VUb1BhY2thZ2VNYXBwaW5nKGdldE5zMlBrZ01hcHBpbmcoKSk7CQkJCQotCQkJfQkJCQotCQl9KTsKLQkJCi0JCWVkaXRvci5zZXRFZGl0b3IodGV4dEVkaXQsIGl0ZW0sIDEpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZU1vZGVsKCkgewotCQltb2RlbC5zZXRTZXJ2aWNlTmFtZShzZXJ2aWNlTmFtZUNvbWJvLmdldFRleHQoKSk7Ci0JCW1vZGVsLnNldFBvcnROYW1lKHBvcnROYW1lQ29tYm8uZ2V0VGV4dCgpKTsKLQkJbW9kZWwuc2V0UGFja2FnZVRleHQocGFja2FnZVRleHQuZ2V0VGV4dCgpKTsKLQkJbW9kZWwuc2V0RGF0YWJpbmRpbmdUeXBlKGRhdGFiaW5kaW5nVHlwZUNvbWJvLmdldFRleHQoKSk7Ci0JCW1vZGVsLnNldEdlbmVyYXRlQWxsQ2hlY2soZ2VuZXJhdGVBbGxDaGVja0JveEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCW1vZGVsLnNldEdlbmVyYXRlU2VydmVyU2lkZUludGVyZmFjZSgKLQkJCQlnZW5lcmF0ZVNlcnZlclNpZGVJbnRlcmZhY2VDaGVja0JveEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCW1vZGVsLnNldE5hbWVzcGFzZVRvUGFja2FnZU1hcHBpbmcoZ2V0TnMyUGtnTWFwcGluZygpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvciNnZXRTdGF0dXMoKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGdldFN0YXR1cygpIAotCXsKLQkJSVN0YXR1cyByZXN1bHQgPSBudWxsOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZVBhY2thZ2VOYW1lKCkgewotCQl0aGlzLnBhY2thZ2VUZXh0LnNldFRleHQocmVhZGVyLnBhY2thZ2VGcm9tVGFyZ2V0TmFtZXNwYWNlKCkpOwotCX0KLQotCS8qKgotCSAqIHBvcHVsYXRlIHRoZSBzZXJ2aWNlIGFuZCB0aGUgcG9ydCBmcm9tIHRoZSBXU0RMIHRoaXMgbmVlZHMgdG8gYmUgcHVibGljCi0JICogc2luY2UgdGhlIFdTRExzZWxlY3Rpb24gcGFnZSBtYXkgY2FsbCB0aGlzCi0JICovCi0JcHVibGljIHZvaWQgcG9wdWxhdGVQYXJhbXNGcm9tV1NETCgpIHsKLQkJaWYgKHJlYWRlciA9PSBudWxsKQotCQkJcmVhZGVyID0gbmV3IFdTRExQcm9wZXJ0eVJlYWRlcigpOwotCQl0cnkgewotCQkJU3RyaW5nIGxuYW1lID0gbW9kZWwuZ2V0V3NkbFVSSSgpOwotCQkJaWYgKCEiIi5lcXVhbHMobG5hbWUudHJpbSgpKSkgewotCi0JCQkJcmVhZGVyLnJlYWRXU0RMKG1vZGVsLmdldFdlYlByb2plY3ROYW1lKCksIGxuYW1lKTsKLQotCQkJCXRoaXMuc2VydmljZVFOYW1lTGlzdCA9IHJlYWRlci5nZXRTZXJ2aWNlTGlzdCgpOwotCQkJCWlmICghc2VydmljZVFOYW1lTGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkJc2VydmljZU5hbWVDb21iby5yZW1vdmVBbGwoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2aWNlUU5hbWVMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJCQkvLyBhZGQgdGhlIGxvY2FsIHBhcnQgb2YgdGhlCi0JCQkJCQlPYmplY3Qgc2VydmljZVFuYW1lSW5zdGFuY2UgPSBzZXJ2aWNlUU5hbWVMaXN0LmdldCgwKTsKLQkJCQkJCUNsYXNzIFFOYW1lQ2xhc3MgPSBDbGFzc0xvYWRpbmdVdGlsCi0JCQkJCQkJCQkJLmxvYWRDbGFzc0Zyb21BbnRDbGFzc0xvYWRlcigiamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSIpOwotCQkJCQkJTWV0aG9kIEdldExvY2FsUGFydE1ldGhvZCAgPSBRTmFtZUNsYXNzLmdldE1ldGhvZCgiZ2V0TG9jYWxQYXJ0IiwgbnVsbCk7Ci0JCQkJCQlPYmplY3QgcmVzdWx0TG9jYWxQYXJ0ID0gR2V0TG9jYWxQYXJ0TWV0aG9kCi0JCQkJCQkJCQkJCQkJLmludm9rZShzZXJ2aWNlUW5hbWVJbnN0YW5jZSwgbnVsbCk7Ci0JCQkJCQlzZXJ2aWNlTmFtZUNvbWJvLmFkZChyZXN1bHRMb2NhbFBhcnQudG9TdHJpbmcoKSk7Ci0JCQkJCX0KLQkJCQkJOwotCQkJCQkvLyBzZWxlY3QgdGhlIGZpcnN0IG9uZSBhcyB0aGUgZGVmYXVsdAotCQkJCQlzZXJ2aWNlTmFtZUNvbWJvLnNlbGVjdCgwKTsKLQotCQkJCQkvLyBsb2FkIHRoZSBwb3J0cwotCQkJCQlsb2FkUG9ydE5hbWVzKCk7Ci0KLQkJCQl9IGVsc2UgewotCQkJCQkvLyBzZXJ2aWNlIG5hbWUgbGlzdCBiZWluZyBlbXB0eSBtZWFucyB3ZSBhcmUgc3dpdGNoaW5nIHRvCi0JCQkJCS8vIHRoZSBpbnRlcmZhY2UgbW9kZQotCQkJCQlpZiAoc2VydmljZU5hbWVDb21ibyE9bnVsbCkgc2VydmljZU5hbWVDb21iby5yZW1vdmVBbGwoKTsKLQkJCQkJaWYgKHBvcnROYW1lQ29tYm8hPW51bGwpIHBvcnROYW1lQ29tYm8ucmVtb3ZlQWxsKCk7Ci0KLQkJCQl9Ci0KLQkJCQlwb3B1bGF0ZVBhY2thZ2VOYW1lKCk7Ci0KLQkJCQkvL3BvcHVsYXRlIHRoZSBuYW1lc3BhY2VzcwotCQkJCWxvYWROYW1lc3BhY2VzKHJlYWRlci5nZXREZWZpbml0aW9uTmFtZXNwYWNlTWFwKCkpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkuZXF1YWxzKCJqYXZheC53c2RsLldTRExFeGNlcHRpb24iKSkKLQkJCXN0YXR1cyA9IFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKAotCQkJCQlOTFMuYmluZChBeGlzMkNyZWF0aW9uVUlNZXNzYWdlcy5FUlJPUl9JTlZBTElEX1dTRExfRklMRV9SRUFEX1dSSVRFTCwKLQkJCQkJCQkgbmV3IFN0cmluZ1tde2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpfSksIGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvYWRQb3J0TmFtZXMoKSB7Ci0JCWludCBzZWxlY3Rpb25JbmRleCA9IHNlcnZpY2VOYW1lQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJaWYgKHNlbGVjdGlvbkluZGV4ICE9IC0xKSB7Ci0JCQlqYXZhLnV0aWwuTGlzdCBwb3J0cyA9IHJlYWRlci5nZXRQb3J0TmFtZUxpc3Qoc2VydmljZVFOYW1lTGlzdAotCQkJCQkuZ2V0KHNlbGVjdGlvbkluZGV4KSk7Ci0JCQlpZiAoIXBvcnRzLmlzRW1wdHkoKSkgewotCQkJCXBvcnROYW1lQ29tYm8ucmVtb3ZlQWxsKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwb3J0cy5zaXplKCk7IGkrKykgewotCQkJCQkvLyBhZGQgdGhlIGxvY2FsIHBhcnQgb2YgdGhlCi0JCQkJCXBvcnROYW1lQ29tYm8uYWRkKHBvcnRzLmdldChpKS50b1N0cmluZygpKTsKLQkJCQl9Ci0JCQkJcG9ydE5hbWVDb21iby5zZWxlY3QoMCk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIFRPRE8gZXJyb3Igbm8gcG9ydHMgZm91bmQKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEZpbGwgdGhlIGNvbWJvIHdpdGggcHJvcGVyIGRhdGFiaW5kaW5nIG5hbWVzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZpbGxEYXRhYmluZGVyQ29tYm8oKSB7Ci0JCWRhdGFiaW5kaW5nVHlwZUNvbWJvLmFkZChBeGlzMkNvbnN0YW50cy5EQVRBX0JJTkRJTkdfQURCKTsKLQkJZGF0YWJpbmRpbmdUeXBlQ29tYm8uYWRkKEF4aXMyQ29uc3RhbnRzLkRBVEFfQklORElOR19OT05FKTsKLQkJZGF0YWJpbmRpbmdUeXBlQ29tYm8uc2VsZWN0KDApOwotCX0KLQkKLQkKLQkvKioKLQkgKiBBIHV0aWwgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBjb2x1bW4KLQkgKiBAcGFyYW0gdGFibGUKLQkgKiBAcGFyYW0gd2lkdGgKLQkgKiBAcGFyYW0gY29sTmFtZQotCSAqLwotCXByaXZhdGUgdm9pZCBkZWNsYXJlQ29sdW1uKFRhYmxlIHRhYmxlLCBpbnQgd2lkdGgsU3RyaW5nIGNvbE5hbWUpewotICAgICAgICBUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsU1dULk5PTkUpOwotICAgICAgICBjb2x1bW4uc2V0V2lkdGgod2lkdGgpOwotICAgICAgICBjb2x1bW4uc2V0VGV4dChjb2xOYW1lKTsKLSAgICB9Ci0JCi0JLyoqCi0JICogTG9hZHMgdGhlIG5hbWVzcGFjZXMKLQkgKiBAcGFyYW0gbmFtZXNwYWNlTWFwCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWROYW1lc3BhY2VzKE1hcCBuYW1lc3BhY2VNYXApewotCQlJdGVyYXRvciBuYW1lc3BhY2VzID0gbmFtZXNwYWNlTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCW5hbWVzcGFjZTJwYWNrYWdlVGFibGUucmVtb3ZlQWxsKCk7Ci0gICAgICAgIFRhYmxlSXRlbVtdIGl0ZW1zID0gbmV3IFRhYmxlSXRlbVtuYW1lc3BhY2VNYXAuc2l6ZSgpXTsgLy8gQW4gaXRlbSBmb3IgZWFjaCBmaWVsZAotICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgIHdoaWxlKG5hbWVzcGFjZXMuaGFzTmV4dCgpKXsKLSAgICAgICAgCQotICAgICAgICAgICBpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0obmFtZXNwYWNlMnBhY2thZ2VUYWJsZSwgU1dULk5VTEwpOwotICAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gKFN0cmluZyluYW1lc3BhY2VzLm5leHQoKTsKLSAgICAgICAgICAgaXRlbXNbaV0uc2V0VGV4dCgwLG5hbWVzcGFjZSk7Ci0gICAgICAgICAgIGl0ZW1zW2ldLnNldFRleHQoMSxnZXRQYWNrYWdlRnJvbU5hbWVzcGFjZShuYW1lc3BhY2UpKTsKLSAgICAgICAgICAgaSsrOwotICAgICAgICB9Ci0gICAgICAgIG5hbWVzcGFjZTJwYWNrYWdlVGFibGUuc2V0VmlzaWJsZSh0cnVlKTsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBwYWNrYWdlIHRvIG5hbWVzcGFjZSBtYXBwaW5ncwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5zMlBrZ01hcHBpbmcoKXsKLQkJU3RyaW5nIHJldHVybkxpc3Q9IiI7Ci0JCVRhYmxlSXRlbVtdIGl0ZW1zID0gbmFtZXNwYWNlMnBhY2thZ2VUYWJsZS5nZXRJdGVtcygpOwotCQlTdHJpbmcgcGFja2FnZVZhbHVlOyAKLQkJZm9yIChpbnQgaT0wO2k8aXRlbXMubGVuZ3RoO2krKyl7Ci0JCQlwYWNrYWdlVmFsdWUgPSBpdGVtc1tpXS5nZXRUZXh0KDEpOwotCQkJaWYgKHBhY2thZ2VWYWx1ZSE9bnVsbCAmJiAhIiIuZXF1YWxzKHBhY2thZ2VWYWx1ZSkpewotCQkJCXJldHVybkxpc3QgPSByZXR1cm5MaXN0ICsKLQkJCQkgICAgICAgICAgICAgKCIiLmVxdWFscyhyZXR1cm5MaXN0KT8iIjoiLCIpICsKLQkJCQkgICAgICAgICAgICAgaXRlbXNbaV0uZ2V0VGV4dCgwKSsgIj0iICsgcGFja2FnZVZhbHVlOwotCQkJfQotCQkJCi0JCX0KLQkJcmV0dXJuICIiLmVxdWFscyhyZXR1cm5MaXN0KT9udWxsOnJldHVybkxpc3Q7Ci0JfQotCQotCQotCS8qKgotCSAqIGdldCB0aGUgcGFja2FnZSBkZXJpdmVkIGJ5ICBOYW1lc3BhY2UKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VGcm9tTmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpewotCQkKLQkJT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvL0NsYXNzIFVSTFByb2Nlc3NvciA9IENsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUuYXhpczIudXRpbC5VUkxQcm9jZXNzb3IiKTsKLQkJCUNsYXNzIFVSTFByb2Nlc3NvciA9IENsYXNzTG9hZGluZ1V0aWwKLQkJCQkJCS5sb2FkQ2xhc3NGcm9tQW50Q2xhc3NMb2FkZXIoIm9yZy5hcGFjaGUuYXhpczIudXRpbC5VUkxQcm9jZXNzb3IiKTsKLQkJCUNsYXNzIHBhcmFtZXRlclR5cGVzW10gPSBuZXcgQ2xhc3NbMV07Ci0JCQlwYXJhbWV0ZXJUeXBlc1swXSA9IFN0cmluZy5jbGFzczsKLQkJCU1ldGhvZCBtYWtlUGFja2FnZU5hbWVNZXRob2QgPSBVUkxQcm9jZXNzb3IKLQkJCQkJCQkJCS5nZXRNZXRob2QoIm1ha2VQYWNrYWdlTmFtZSIsIHBhcmFtZXRlclR5cGVzKTsKLQkJCU9iamVjdCBhcmdzW10gPSBuZXcgT2JqZWN0WzFdOwotCQkJYXJnc1swXSA9IG5hbWVzcGFjZTsKLQkJCXJlc3VsdCA9IG1ha2VQYWNrYWdlTmFtZU1ldGhvZC5pbnZva2UobWFrZVBhY2thZ2VOYW1lTWV0aG9kLCBhcmdzKTsKLQkJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gKFN0cmluZylyZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMyL2NyZWF0aW9uL3VpL3dzcnQvQXhpczJCZWFuQ29uZmlnV2lkZ2V0RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzMi9jcmVhdGlvbi91aS93c3J0L0F4aXMyQmVhbkNvbmZpZ1dpZGdldEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NhZTdmYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMyL2NyZWF0aW9uL3VpL3dzcnQvQXhpczJCZWFuQ29uZmlnV2lkZ2V0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBXU08yIEluYy4gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogV1NPMiBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDcwMTEwICAgMTY4NzYyIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgY29kZSB0byBpbnRyb2R1c2UgdGhlIEF4aXMyIAotICogCQkJCQkJCQkJCSAgcnVudGltZSB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjIKLSAqIDIwMDcwNDI1ICAgMTgzMDQ2IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgKLSAqIDIwMDcwNjAxICAgMTkwNTA1IHBtb29na0BjYS5pYm0uY29tIC0gUGV0ZXIgTW9vZ2sKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzMi5jcmVhdGlvbi51aS53c3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUuY29tbWFuZC5BeGlzMkRlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLmRhdGEuRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLm1lc3NhZ2VzLkF4aXMyQ3JlYXRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzMi5jcmVhdGlvbi51aS53aWRnZXRzLmJlYW4uU2VydmljZXNYTUxTZWxlY3RCZWFuV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5JTmFtZWRXaWRnZXRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5JTmFtZWRXaWRnZXRDb250cmlidXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuU2ltcGxlV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldERhdGFDb250cmlidXRvcjsKLQotcHVibGljIGNsYXNzIEF4aXMyQmVhbkNvbmZpZ1dpZGdldEZhY3RvcnkgaW1wbGVtZW50cyBJTmFtZWRXaWRnZXRDb250cmlidXRvckZhY3RvcnkgewotCi0JcHJpdmF0ZSBTaW1wbGVXaWRnZXRDb250cmlidXRvciAgc2VydmljZXNYTUxTZWxlY3RXaWRnZXRDb250cmliOwotCXByaXZhdGUgRGF0YU1vZGVsICAgICAgICAgICAgICAgIG1vZGVsOwotCi0JcHVibGljIEF4aXMyQmVhbkNvbmZpZ1dpZGdldEZhY3RvcnkoKXsJICAKLQl9Ci0KLQlwdWJsaWMgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3IgZ2V0Rmlyc3ROYW1lZFdpZGdldCgpewotCQlpZiggc2VydmljZXNYTUxTZWxlY3RXaWRnZXRDb250cmliID09IG51bGwgKSBpbml0KCk7Ci0JCXJldHVybiBzZXJ2aWNlc1hNTFNlbGVjdFdpZGdldENvbnRyaWI7Ci0JfQotCi0JcHVibGljIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIGdldE5leHROYW1lZFdpZGdldCggSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3Igd2lkZ2V0Q29udHJpYnV0b3IpewotCQlpZiggc2VydmljZXNYTUxTZWxlY3RXaWRnZXRDb250cmliID09IG51bGwgKSBpbml0KCk7Ci0JCUlOYW1lZFdpZGdldENvbnRyaWJ1dG9yIG5leHRXaWRnZXRDb250cmliID0gbnVsbDsKLQkJcmV0dXJuIG5leHRXaWRnZXRDb250cmliOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KSAKLQl7Ci0JCS8vIE1hcCB0aGUgZGF0YSBtb2RlbCBmcm9tIHRoZSBkZWZhdWx0aW5nIGNvbW1hbmQgdG8gdGhpcyB3aWRnZXQgZmFjdG9yeS4KLQkJLy8gVGhlIGZyYW1ld29yayB3aWxsIGFjdHVhbGx5IHRvIHRoZSBjYWxsIHRvIGdldFdlYlNlcnZpY2VEYXRhTW9kZWwgaW4KLQkJLy8gdGhlIEV4YW1wbGVEZWZhdWx0aW5nQ29tbWFuZCBjbGFzcyBhbmQgdGhlbiBjYWxsIHRoZSBzZXRXZWJTZXJ2aWNlRGF0YU1vZGVsCi0JCS8vIG1ldGhvZCBpbiB0aGlzIGNsYXNzLgotCQlkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQXhpczJEZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAiV2ViU2VydmljZURhdGFNb2RlbCIsICAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSAgICAgICAgICAgICBBeGlzMkJlYW5Db25maWdXaWRnZXRGYWN0b3J5LmNsYXNzICk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0V2ViU2VydmljZURhdGFNb2RlbCggRGF0YU1vZGVsIG1vZGVsICl7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdCgpewotCQkvL1BhZ2VzIG9mIEF4aXMyIFdlYiBTZXJ2aWNlcyBKYXZhIEJlYW4gU2NlbmFyaW8KLQkJU2VydmljZXNYTUxTZWxlY3RCZWFuV2lkZ2V0IHNlcnZpY2VzWE1MU2VsZWN0V2lkZ2V0ID0gCi0JCQkJCQkJCW5ldyBTZXJ2aWNlc1hNTFNlbGVjdEJlYW5XaWRnZXQobW9kZWwpOwotCQlzZXJ2aWNlc1hNTFNlbGVjdFdpZGdldENvbnRyaWIgID0gY3JlYXRlV2lkZ2V0Q29udHJpYnV0b3IoIAotCQkJCUF4aXMyQ3JlYXRpb25VSU1lc3NhZ2VzLkxBQkVMX0FYSVMyX1BSRUZFUkVOQ0VfUEFHRV9IRUFESU5HLAotCQkJCUF4aXMyQ3JlYXRpb25VSU1lc3NhZ2VzLkxBQkVMX0FYSVMyX1BSRUZFUkVOQ0VfUEFHRV9TVUJfSEVBRElORywgCi0JCQkJc2VydmljZXNYTUxTZWxlY3RXaWRnZXQgKTsKLQl9Ci0KLQlwcml2YXRlIFNpbXBsZVdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZVdpZGdldENvbnRyaWJ1dG9yKFN0cmluZyB0aXRsZSwgCi0JCQkJCQkJCQkJCQkJCQlTdHJpbmcgZGVzY3JpcHRpb24sIAotCQkJCQkJCQkJCQkJCQkJZmluYWwgV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yIGNvbnRyaWJ1dG9yKXsKLQkJU2ltcGxlV2lkZ2V0Q29udHJpYnV0b3Igd2lkZ2V0Q29udHJpYiAgPSBuZXcgU2ltcGxlV2lkZ2V0Q29udHJpYnV0b3IoKTsKLQkJd2lkZ2V0Q29udHJpYi5zZXRUaXRsZSh0aXRsZSk7Ci0JCXdpZGdldENvbnRyaWIuc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwotCQl3aWRnZXRDb250cmliLnNldEZhY3RvcnkoIG5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKXsKLQkJCXB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKXsKLQkJCQlyZXR1cm4gY29udHJpYnV0b3I7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gd2lkZ2V0Q29udHJpYjsKLQl9ICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMyL2NyZWF0aW9uL3VpL3dzcnQvQXhpczJDaGVja1dTRExDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMyL2NyZWF0aW9uL3VpL3dzcnQvQXhpczJDaGVja1dTRExDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNGQzYWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzMi9jcmVhdGlvbi91aS93c3J0L0F4aXMyQ2hlY2tXU0RMQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDgwMTI5ICAgMjA5NDExIGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMyLmNyZWF0aW9uLnVpLndzcnQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUudXRpbHMuU2VydmljZVBpbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBBeGlzMkNoZWNrV1NETENvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbnsKLQkKLQlwcml2YXRlIEF4aXMyV2ViU2VydmljZSB3c187Ci0KLQlwcml2YXRlIFN0cmluZyB3c2RsVVJJXzsKLQkKLQlwdWJsaWMgQXhpczJDaGVja1dTRExDb21tYW5kKCkgewotCX0KLQkKLQlwdWJsaWMgQXhpczJDaGVja1dTRExDb21tYW5kKEF4aXMyV2ViU2VydmljZSB3cykgewotCQl3c18gPSB3czsKLQotCX0KLQkKLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgYWRhcHRhYmxlICkgCi0JewotCSAJCi0JIAl3c2RsVVJJXyA9IHdzXy5nZXRXZWJTZXJ2aWNlSW5mbygpLmdldFdzZGxVUkwoKTsKLQkJdHJ5IHsKLQkJCVNlcnZpY2VQaW5nVXRpbCBzZXJ2aWNlUGluZ1V0aWwgPSBuZXcgU2VydmljZVBpbmdVdGlsKCk7Ci0JCQlzZXJ2aWNlUGluZ1V0aWwuY29ubmVjdFRvVVJMKHdzZGxVUklfKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUxKSB7Ci0JCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCQkJZTEucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCSAgfQotCQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldFdzZGxVUkkoKSB7Ci0JCXJldHVybiB3c2RsVVJJXzsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzMi9jcmVhdGlvbi91aS93c3J0L0F4aXMyU2tlbENvbmZpZ1dpZGdldEZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpczIvY3JlYXRpb24vdWkvd3NydC9BeGlzMlNrZWxDb25maWdXaWRnZXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMTcwNmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzMi9jcmVhdGlvbi91aS93c3J0L0F4aXMyU2tlbENvbmZpZ1dpZGdldEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDExMCAgIDE2ODc2MiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbml0aWFsIGNvZGUgdG8gaW50cm9kdXNlIHRoZSBBeGlzMiAKLSAqIAkJCQkJCQkJCQkgIHJ1bnRpbWUgdG8gdGhlIGZyYW1ld29yayBmb3IgMTY4NzYyCi0gKiAyMDA3MDYwMSAgIDE5MDUwNSBwbW9vZ2tAY2EuaWJtLmNvbSAtIFBldGVyIE1vb2drCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpczIuY3JlYXRpb24udWkud3NydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLmNvbW1hbmQuQXhpczJEZWZhdWx0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS5kYXRhLkRhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS5tZXNzYWdlcy5BeGlzMkNyZWF0aW9uVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpczIuY3JlYXRpb24udWkud2lkZ2V0cy5za2VsZXRvbi5XU0RMMkpBVkFTa2VsQ29uZmlnV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5JTmFtZWRXaWRnZXRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5JTmFtZWRXaWRnZXRDb250cmlidXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuU2ltcGxlV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldERhdGFDb250cmlidXRvcjsKLQotcHVibGljIGNsYXNzIEF4aXMyU2tlbENvbmZpZ1dpZGdldEZhY3RvcnkgaW1wbGVtZW50cyBJTmFtZWRXaWRnZXRDb250cmlidXRvckZhY3RvcnkgewotCi0JcHJpdmF0ZSBTaW1wbGVXaWRnZXRDb250cmlidXRvciAgc2tlbENvbmZpZzFXaWRnZXRDb250cmliOwotCXByaXZhdGUgRGF0YU1vZGVsICAgICAgICAgICAgICAgIG1vZGVsOwotCi0JcHVibGljIEF4aXMyU2tlbENvbmZpZ1dpZGdldEZhY3RvcnkoKXsJICAKLQl9Ci0KLQlwdWJsaWMgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3IgZ2V0Rmlyc3ROYW1lZFdpZGdldCgpewotCQlpZiggc2tlbENvbmZpZzFXaWRnZXRDb250cmliID09IG51bGwgKSBpbml0KCk7Ci0JCXJldHVybiBza2VsQ29uZmlnMVdpZGdldENvbnRyaWI7Ci0JfQotCi0JcHVibGljIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIGdldE5leHROYW1lZFdpZGdldCggSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3Igd2lkZ2V0Q29udHJpYnV0b3IpewotCQlpZiggc2tlbENvbmZpZzFXaWRnZXRDb250cmliID09IG51bGwgKSBpbml0KCk7Ci0JCUlOYW1lZFdpZGdldENvbnRyaWJ1dG9yIG5leHRXaWRnZXRDb250cmliID0gbnVsbDsKLQkJcmV0dXJuIG5leHRXaWRnZXRDb250cmliOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KXsKLQkJLy8gTWFwIHRoZSBkYXRhIG1vZGVsIGZyb20gdGhlIGRlZmF1bHRpbmcgY29tbWFuZCB0byB0aGlzIHdpZGdldCBmYWN0b3J5LgotCQkvLyBUaGUgZnJhbWV3b3JrIHdpbGwgYWN0dWFsbHkgdG8gdGhlIGNhbGwgdG8gZ2V0V2ViU2VydmljZURhdGFNb2RlbCBpbgotCQkvLyB0aGUgRXhhbXBsZURlZmF1bHRpbmdDb21tYW5kIGNsYXNzIGFuZCB0aGVuIGNhbGwgdGhlIHNldFdlYlNlcnZpY2VEYXRhTW9kZWwKLQkJLy8gbWV0aG9kIGluIHRoaXMgY2xhc3MuCi0JCWRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBBeGlzMkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldlYlNlcnZpY2VEYXRhTW9kZWwiLCAgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkgICAgICAgICAgICAgQXhpczJTa2VsQ29uZmlnV2lkZ2V0RmFjdG9yeS5jbGFzcyApOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2VEYXRhTW9kZWwoIERhdGFNb2RlbCBtb2RlbCApewotCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXQoKXsKLQkJV1NETDJKQVZBU2tlbENvbmZpZ1dpZGdldCAgc2tlbDEgPSBuZXcgV1NETDJKQVZBU2tlbENvbmZpZ1dpZGdldCggbW9kZWwgKTsKLQotCQlza2VsQ29uZmlnMVdpZGdldENvbnRyaWIgID0gY3JlYXRlV2lkZ2V0Q29udHJpYnV0b3IoIAotCQkJCUF4aXMyQ3JlYXRpb25VSU1lc3NhZ2VzLkxBQkVMX0pBVkFfMl9XU0RMX1BBR0VfSEVBRElORywKLQkJCQlBeGlzMkNyZWF0aW9uVUlNZXNzYWdlcy5MQUJFTF9KQVZBXzJfV1NETF9QQUdFX1NVQl9IRUFESU5HLCAKLQkJCQlza2VsMSApOwotCX0KLQotCXByaXZhdGUgU2ltcGxlV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlV2lkZ2V0Q29udHJpYnV0b3IoU3RyaW5nIHRpdGxlLCAKLQkJCQkJCQkJCQkJCQkJCVN0cmluZyBkZXNjcmlwdGlvbiwgCi0JCQkJCQkJCQkJCQkJCQlmaW5hbCBXaWRnZXREYXRhQ29udHJpYnV0b3IgY29udHJpYnV0b3IpewotCQlTaW1wbGVXaWRnZXRDb250cmlidXRvciB3aWRnZXRDb250cmliICA9IG5ldyBTaW1wbGVXaWRnZXRDb250cmlidXRvcigpOwotCQl3aWRnZXRDb250cmliLnNldFRpdGxlKHRpdGxlKTsKLQkJd2lkZ2V0Q29udHJpYi5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0JCXdpZGdldENvbnRyaWIuc2V0RmFjdG9yeSggbmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpewotCQkJcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpewotCQkJCXJldHVybiBjb250cmlidXRvcjsKLQkJCX0KLQkJfSk7Ci0KLQkJcmV0dXJuIHdpZGdldENvbnRyaWI7Ci0JfSAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzMi9jcmVhdGlvbi91aS93c3J0L0F4aXMyV2ViU2VydmljZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzMi9jcmVhdGlvbi91aS93c3J0L0F4aXMyV2ViU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2E0NDc5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpczIvY3JlYXRpb24vdWkvd3NydC9BeGlzMldlYlNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IFdTTzIgSW5jLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBXU08yIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzAxMTAgICAxNjg3NjIgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgSW5pdGlhbCBjb2RlIHRvIGludHJvZHVzZSB0aGUgQXhpczIgcnVudGltZSB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjIKLSAqIDIwMDcwNDI1ICAgMTgzMDQ2IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgKLSAqIDIwMDcwODE1ICAgMTg3ODQwIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgKLSAqIDIwMDgwMTI5ICAgMjA5NDExIGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMyLmNyZWF0aW9uLnVpLndzcnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLmNvbW1hbmQuQXhpczJCVUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUuY29tbWFuZC5BeGlzMkJVU2VydmljZUNyZWF0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS5jb21tYW5kLkF4aXMyQnVpbGRQcm9qZWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS5jb21tYW5kLkF4aXMyQ2xlYW51cENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUuY29tbWFuZC5BeGlzMkRlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLmNvbW1hbmQuQXhpczJTZXJ2aWNlc1hNTFZhbGlkYXRpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLmNvbW1hbmQuQXhpczJTa2VsSW1wbENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUuY29tbWFuZC5BeGlzMlREQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS5jb21tYW5kLkF4aXMyVERTZXJ2aWNlQ3JlYXRpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLmNvbW1hbmQuQXhpczJXU0RMMkphdmFDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLmNvbW1hbmQuQXhpczJXZWJzZXJ2aWNlc1NlcnZlckNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUuZGF0YS5EYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuSUNvbW1hbmRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLlNpbXBsZUNvbW1hbmRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LkFic3RyYWN0V2ViU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5JQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LldlYlNlcnZpY2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LldlYlNlcnZpY2VTY2VuYXJpbzsKLQotcHVibGljIGNsYXNzIEF4aXMyV2ViU2VydmljZSBleHRlbmRzIEFic3RyYWN0V2ViU2VydmljZQotewotLy8JcHJpdmF0ZSBBeGlzMldlYlNlcnZpY2VJbmZvIGF4aXMyV2ViU2VydmljZUluZm87Ci0KLQlwdWJsaWMgQXhpczJXZWJTZXJ2aWNlKFdlYlNlcnZpY2VJbmZvIGluZm8pCi0JewotCQlzdXBlcihpbmZvKTsKLQl9Ci0KLQlwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGFzc2VtYmxlKElFbnZpcm9ubWVudCBlbnYsIElDb250ZXh0IGN0eCwKLQkJCUlTZWxlY3Rpb24gc2VsLCBTdHJpbmcgcHJvamVjdCwgU3RyaW5nIGVhclByb2plY3QpCi0JewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGRlcGxveShJRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLAotCQkJU3RyaW5nIHByb2plY3QsIFN0cmluZyBlYXJQcm9qZWN0KQotCXsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElDb21tYW5kRmFjdG9yeSBkZXZlbG9wKElFbnZpcm9ubWVudCBlbnYsIElDb250ZXh0IGN0eCwgSVNlbGVjdGlvbiBzZWwsCi0JCQlTdHJpbmcgcHJvamVjdCwgU3RyaW5nIGVhclByb2plY3QpCi0JewotCQlWZWN0b3IgY29tbWFuZHMgPSBuZXcgVmVjdG9yKCk7Ci0JCURhdGFNb2RlbCBtb2RlbCA9IG5ldyBEYXRhTW9kZWwoKTsKLQkJLy9FY2xpcHNlRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSAoRWNsaXBzZUVudmlyb25tZW50KWVudjsKLQotCQltb2RlbC5zZXRXZWJQcm9qZWN0TmFtZShwcm9qZWN0KTsKLQotCQlpZiAoY3R4LmdldFNjZW5hcmlvKCkuZ2V0VmFsdWUoKSA9PSBXZWJTZXJ2aWNlU2NlbmFyaW8uQk9UVE9NVVApCXsgCi0JCQljb21tYW5kcy5hZGQobmV3IEF4aXMyRGVmYXVsdGluZ0NvbW1hbmQoIG1vZGVsLHRoaXMsIGN0eC5nZXRTY2VuYXJpbygpLmdldFZhbHVlKCkgKSApOwotCQkJY29tbWFuZHMuYWRkKG5ldyBBeGlzMkJVQ29tbWFuZCggbW9kZWwgKSApOwotCQkJY29tbWFuZHMuYWRkKG5ldyBBeGlzMlNlcnZpY2VzWE1MVmFsaWRhdGlvbkNvbW1hbmQoKSk7Ci0JCQljb21tYW5kcy5hZGQobmV3IEF4aXMyQlVTZXJ2aWNlQ3JlYXRpb25Db21tYW5kKG1vZGVsLHRoaXMscHJvamVjdCkpOwotCQkJY29tbWFuZHMuYWRkKG5ldyBBeGlzMldlYnNlcnZpY2VzU2VydmVyQ29tbWFuZChtb2RlbCwgY3R4LmdldFNjZW5hcmlvKCkuZ2V0VmFsdWUoKSApKTsKLQkJCS8vSW5jbHVkaW5nIGNvbW1hbmQgdG8gYnVpbGQgZm9yIHRoZSBmaXggMTg3ODQwCi0JCQljb21tYW5kcy5hZGQoIG5ldyBBeGlzMkJ1aWxkUHJvamVjdENvbW1hbmQoCi0JCQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0KSx0cnVlKSk7Ci0JCX0gCi0JCWVsc2UgaWYgKGN0eC5nZXRTY2VuYXJpbygpLmdldFZhbHVlKCkgPT0gV2ViU2VydmljZVNjZW5hcmlvLlRPUERPV04pIHsgIAotCQkJY29tbWFuZHMuYWRkKG5ldyBBeGlzMkRlZmF1bHRpbmdDb21tYW5kKCBtb2RlbCx0aGlzLCBjdHguZ2V0U2NlbmFyaW8oKS5nZXRWYWx1ZSgpICApICk7Ci0JCQljb21tYW5kcy5hZGQobmV3IEF4aXMyVERDb21tYW5kKCBtb2RlbCkgKTsKLQkJCWNvbW1hbmRzLmFkZChuZXcgQXhpczJXU0RMMkphdmFDb21tYW5kKCBtb2RlbCkgKTsKLQkJCWNvbW1hbmRzLmFkZCggbmV3IEF4aXMyQnVpbGRQcm9qZWN0Q29tbWFuZCgKLQkJCQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0KSx0cnVlKSk7Ci0JCQljb21tYW5kcy5hZGQobmV3IEF4aXMyVERTZXJ2aWNlQ3JlYXRpb25Db21tYW5kKG1vZGVsLHRoaXMscHJvamVjdCkpOwotCQkJY29tbWFuZHMuYWRkKG5ldyBBeGlzMldlYnNlcnZpY2VzU2VydmVyQ29tbWFuZChtb2RlbCwgY3R4LmdldFNjZW5hcmlvKCkuZ2V0VmFsdWUoKSkpOwotCQkJLy95ZXMsIGFnYWluIGludm9rZSB0aGUgYnVpbGQgY29tbWFuZCB0byByZWRlcGxveSB0aGUgc2VydmljZSBhZnRlciBjb21wbGV0ZSBmdWxsIGJ1aWxkCi0JCQljb21tYW5kcy5hZGQoIG5ldyBBeGlzMkJ1aWxkUHJvamVjdENvbW1hbmQoCi0JCQkJCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdCksdHJ1ZSkpOwotCQkJY29tbWFuZHMuYWRkKG5ldyBBeGlzMlNrZWxJbXBsQ29tbWFuZCh0aGlzLmdldFdlYlNlcnZpY2VJbmZvKCksbW9kZWwpKTsKLQkJCWNvbW1hbmRzLmFkZChuZXcgQXhpczJDbGVhbnVwQ29tbWFuZCgpKTsKLQkJfSAKLQkJZWxzZSAKLQkJewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlyZXR1cm4gbmV3IFNpbXBsZUNvbW1hbmRGYWN0b3J5KGNvbW1hbmRzKTsKLQl9Ci0KLQlwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGluc3RhbGwoSUVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwKLQkJCVN0cmluZyBwcm9qZWN0LCBTdHJpbmcgZWFyUHJvamVjdCkKLQl7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgcnVuKElFbnZpcm9ubWVudCBlbnYsIElDb250ZXh0IGN0eCwgSVNlbGVjdGlvbiBzZWwsCi0JCQlTdHJpbmcgcHJvamVjdCwgU3RyaW5nIGVhclByb2plY3QpCi0JewotCQlWZWN0b3IgY29tbWFuZHMgPSBuZXcgVmVjdG9yKCk7Ci0KLQkJCi0JCQljb21tYW5kcy5hZGQobmV3IEF4aXMyQ2hlY2tXU0RMQ29tbWFuZCh0aGlzKSk7Ci0JCQkKLQotCQkJcmV0dXJuIG5ldyBTaW1wbGVDb21tYW5kRmFjdG9yeShjb21tYW5kcyk7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMyL2NyZWF0aW9uL3VpL3dzcnQvQXhpczJXZWJTZXJ2aWNlSW5mby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzMi9jcmVhdGlvbi91aS93c3J0L0F4aXMyV2ViU2VydmljZUluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIzNWU5ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMyL2NyZWF0aW9uL3VpL3dzcnQvQXhpczJXZWJTZXJ2aWNlSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBXU08yIEluYy4gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogV1NPMiBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDcwMTEwICAgMTY4NzYyIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgY29kZSB0byBpbnRyb2R1c2UgdGhlIEF4aXMyIAotICogCQkJCQkJCQkJCSAgcnVudGltZSB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzMi5jcmVhdGlvbi51aS53c3J0OwotCi1wdWJsaWMgY2xhc3MgQXhpczJXZWJTZXJ2aWNlSW5mbyB7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpczIvY3JlYXRpb24vdWkvd3NydC9BeGlzMldlYlNlcnZpY2VSdW50aW1lLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMyL2NyZWF0aW9uL3VpL3dzcnQvQXhpczJXZWJTZXJ2aWNlUnVudGltZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGZiNTgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpczIvY3JlYXRpb24vdWkvd3NydC9BeGlzMldlYlNlcnZpY2VSdW50aW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IFdTTzIgSW5jLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBXU08yIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzAxMTAgICAxNjg3NjIgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgSW5pdGlhbCBjb2RlIHRvIGludHJvZHVzZSB0aGUgQXhpczIgCi0gKiAJCQkJCQkJCQkJICBydW50aW1lIHRvIHRoZSBmcmFtZXdvcmsgZm9yIDE2ODc2MgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMyLmNyZWF0aW9uLnVpLndzcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpczIuY29uc3VtcHRpb24udWkud3NydC5BeGlzMldlYlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuQWJzdHJhY3RXZWJTZXJ2aWNlUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5JV2ViU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5JV2ViU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5XZWJTZXJ2aWNlQ2xpZW50SW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5XZWJTZXJ2aWNlSW5mbzsKLQotcHVibGljIGNsYXNzIEF4aXMyV2ViU2VydmljZVJ1bnRpbWUgZXh0ZW5kcyBBYnN0cmFjdFdlYlNlcnZpY2VSdW50aW1lCi17Ci0KLQlwdWJsaWMgSVdlYlNlcnZpY2UgZ2V0V2ViU2VydmljZShXZWJTZXJ2aWNlSW5mbyBpbmZvKXsKLQkJcmV0dXJuIG5ldyBBeGlzMldlYlNlcnZpY2UoaW5mbyk7Ci0JfQotCi0JcHVibGljIElXZWJTZXJ2aWNlQ2xpZW50IGdldFdlYlNlcnZpY2VDbGllbnQoV2ViU2VydmljZUNsaWVudEluZm8gaW5mbyl7Ci0JCXJldHVybiBuZXcgQXhpczJXZWJTZXJ2aWNlQ2xpZW50KGluZm8pOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDRlODYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MGFkY2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotYnVpbGQueG1sCi1qYXZhQ29tcGlsZXIuLi5hcmdzCi1AZG90Ci1vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWlfMS4wLjIwMS4yMDA4MDQwMjAyMDQuamFyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2M3ZTE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY5YzI2YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jVHVlIE1hciAyMCAxMDo0NTozOCBMS1QgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QzMDc2MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVQTFVHSU5fTkFNRQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4yMDEucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkucGx1Z2luLldlYlNlcnZpY2VBeGlzMlVJUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlUExVR0lOX1BST1ZJREVSCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUsCi0gb3JnLmVjbGlwc2UuanN0LndzLAotIG9yZy5lY2xpcHNlLmpzdC53cy51aQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkucGx1Z2luLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzMi5jb25zdW1wdGlvbi51aS5wcmVmZXJlbmNlcwotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU3M2JkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUwODYzZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMgYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBXU08yIEluYyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotIyAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyAyMDA3MDEzMCAgIDE2ODc2MiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbml0aWFsIEFQSSBDb250cmlidXRpb24KLSMgMjAwNzA1MDIgICAxODQzMDIgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgRml4IGNvcHlyaWdodCBmb3IgQXhpczIgcGx1Z2lucwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE2M2MxMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IFdTTzIgSW5jLiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotIyAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyAyMDA3MDExOCAgIDE2ODc2MiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbml0aWFsIGNvZGUgdG8gaW50cm9kdXNlIHRoZSBBeGlzMiBydW50aW1lIHRvIHRoZSBmcmFtZXdvcmsgZm9yIDE2ODc2MgotIyAyMDA3MDUwMSAgIDE4NDYxNyBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBQcm92aWRlIHBsdWdpbiBkZXRhaWxzCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0KLSMKLSMgTWVzc2FnZXMgaW4gcGx1Z2luLnhtbC4KLVBMVUdJTl9OQU1FPVdlYnNlcnZpY2UgQXhpczIgVUkgUGx1Zy1pbgotUExVR0lOX1BST1ZJREVSPVdTTzIKLQotIyBXZWIgU2VydmljZXMgUHJlZmVyYW5jZSBQYWdlcwotIyBDYXRlZ29yaWVzCi1QUkVGRVJFTkNFX0NBVEVHT1JZX0FYSVMyX1JVTlRJTUU9QXhpczIgUHJlZmVyZW5jZXMgCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYyMjEwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPHBsdWdpbj4KLSAgCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPiAgICAgCi0gICAgICA8cGFnZQotICAgICAgICAgICAgbmFtZT0iJVBSRUZFUkVOQ0VfQ0FURUdPUllfQVhJUzJfUlVOVElNRSIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMubmFtZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpczIuY29uc3VtcHRpb24udWkucHJlZmVyZW5jZXMuQXhpczJSdW50aW1lUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMyLmNvbnN1bXB0aW9uLnVpLnByZWZlcmVuY2VzLkF4aXMyUnVudGltZVByZWZlcmVuY2VQYWdlIj4KLSAgICAgIDwvcGFnZT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL3VpL3BsdWdpbi9XZWJTZXJ2aWNlQXhpczJVSVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi91aS9wbHVnaW4vV2ViU2VydmljZUF4aXMyVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRiYTg0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL3VpL3BsdWdpbi9XZWJTZXJ2aWNlQXhpczJVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBXU08yIEluYy4gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogV1NPMiBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDcwMTMwICAgMTY4NzYyIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgY29kZSB0byBpbnRyb2R1c2UgdGhlIEF4aXMyIAotICogCQkJCQkJCQkJCSAgcnVudGltZSB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjIKLSAqIDIwMDcwNDI1ICAgMTgzMDQ2IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkucGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlQXhpczJVSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCi0JLy8gVGhlIHBsdWctaW4gSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpIjsKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBXZWJTZXJ2aWNlQXhpczJVSVBsdWdpbiBwbHVnaW47Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIFdlYlNlcnZpY2VBeGlzMlVJUGx1Z2luKCkgewotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKgotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgV2ViU2VydmljZUF4aXMyVUlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpczIvY29uc3VtcHRpb24vdWkvcHJlZmVyZW5jZXMvQXhpczJSdW50aW1lUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpczIvY29uc3VtcHRpb24vdWkvcHJlZmVyZW5jZXMvQXhpczJSdW50aW1lUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZlNjUxNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMyL2NvbnN1bXB0aW9uL3VpL3ByZWZlcmVuY2VzL0F4aXMyUnVudGltZVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBXU08yIEluYy4gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogV1NPMiBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDcwMTMwICAgMTY4NzYyIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgY29kZSB0byBpbnRyb2R1c2UgdGhlIEF4aXMyIAotICogICAgICAgICAgICAgICAgICAgICAgcnVudGltZSB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjIKLSAqIDIwMDcwNDI1ICAgMTgzMDQ2IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgKLSAqIDIwMDcwNTAxICAgMTgwMjg0IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgKLSAqIDIwMDcwNTExICAgMTg2NDQwIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGggZml4IDE4NjQ0MAotICogMjAwNzA1MTMgICAxODY0MzAgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgZml4IGZvciAxODY0MzAKLSAqICAgICAgICAgICAgICAgICAgICAgIFRleHQgbm90IGFjY2Vzc2libGUgb24gQVhJUzIgd2l6YXJkIHBhZ2VzLgotICogMjAwNzA1MTYgICAxODMxNDcgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCBGaXggZm9yIHRoZSBwZXJzaXN0aW5nIERCQ1MgcGF0aHMKLSAqIDIwMDcwNTIzICAgMTc0ODc2IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIFBlcnNpc3QgUHJlZmVyZW5jZXMgaW5zaWRlIEZyYW1ld29yawotICogMjAwNzA2MDMgICAxODg3NDAgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgCi0gKiAyMDA3MDYwNCAgIDE5MDUwNSBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCAKLSAqIDIwMDcwNjA0ICAgMTkwMDY3IHBtb29na0BjYS5pYm0uY29tIC0gUGV0ZXIgTW9vZ2sKLSAqIDIwMDcwODI0ICAgMjAwNTE1IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIE5PTi1OTFMgbW92ZSB0byBzZXBlcmF0ZSBmaWxlCi0gKiAyMDA3MDgyNyAgIDE4ODczMiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBSZXN0b3JlIGRlZmF1bHRzIGZvciBwcmVmZXJlbmNlcwotICogMjAwNzEwMzAJICAyMDc2MTggemluYUBjYS5pYm0uY29tIC0gWmluYSBNb3N0YWZpYSwgUGFnZSBHVUkgc2VxdWVuY2UgdXNpbmcgdGFiIGlzIG5vdCBjb3JyZWN0ICggdmlvbGF0ZXMgQWNjZXNzaWJpbGl0eSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpczIuY29uc3VtcHRpb24udWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLmNvbnN0YW50LkF4aXMyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLmNvbnRleHQuQXhpczJFbWl0dGVyQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5jb250ZXh0LkF4aXMyRW1pdHRlckRlZmF1bHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLnBsdWdpbi5XZWJTZXJ2aWNlQXhpczJDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLnBsdWdpbi5tZXNzYWdlcy5BeGlzMkNvcmVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLnV0aWxzLkF4aXMyQ29yZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLnV0aWxzLlJ1bnRpbWVQcm9wZXJ0eVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS5wbHVnaW4uV2ViU2VydmljZUF4aXMyVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmNvbW1vbi5VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotCi1wdWJsaWMgY2xhc3MgQXhpczJSdW50aW1lUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0KLQlwcml2YXRlIFRleHQgYXhpczJQYXRoOyAKLQlwcml2YXRlIFRleHQgc3RhdHVzTGFiZWw7Ci0JcHJpdmF0ZSBDb21ibyBhYXJFeHRlbnNpb25Db21ibzsgCi0JcHJpdmF0ZSBDb21ibyBzZXJ2aWNlRGF0YWJpbmRpbmdDb21ibzsKLQlwcml2YXRlIENvbWJvIGNsaWVudERhdGFiaW5kaW5nQ29tYm87Ci0JcHJpdmF0ZSBCdXR0b24gZ2VuZXJhdGVTZXJ2ZXJTaWRlSW50ZXJmYWNlQ2hlY2tCb3hCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gZ2VuZXJhdGVBbGxDaGVja0JveEJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBzeW5jQW5kQXN5bmNSYWRpb0J1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBzeW5jT25seVJhZGlvQnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIGFzeW5jT25seVJhZGlvQnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIGNsaWVudFRlc3RDYXNlQ2hlY2tCb3hCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gY2xpZW50R2VuZXJhdGVBbGxDaGVja0JveEJ1dHRvbjsKLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBzdXBlcnBhcmVudCkgewotCQkKLQkJVUlVdGlscyB1aVV0aWxzID0gbmV3IFVJVXRpbHMoV2ViU2VydmljZUF4aXMyVUlQbHVnaW4uUExVR0lOX0lEKTsKLQkJZmluYWwgQ29tcG9zaXRlICBtYWluQ29tcCA9IHVpVXRpbHMuY3JlYXRlQ29tcG9zaXRlKHN1cGVycGFyZW50LCAxKTsKLQkJCi0JCVRhYkZvbGRlciBheGlzMlByZWZlcmVuY2VUYWIgPSBuZXcgVGFiRm9sZGVyKG1haW5Db21wLCBTV1QuV1JBUCk7Ci0JCWF4aXMyUHJlZmVyZW5jZVRhYi5zZXRMYXlvdXREYXRhKCBuZXcgR3JpZERhdGEoR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCB8IEdyaWREYXRhLkZJTExfQk9USCkgKTsKLQotCQkKLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUF4aXMyIFJ1bnRpbWUgTG9jYXRpb24gR3JvdXAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLwotCQlUYWJJdGVtIHJ1bnRpbWVJbnN0YWxMb2NhdGlvbkl0ZW0gPSBuZXcgVGFiSXRlbShheGlzMlByZWZlcmVuY2VUYWIsIFNXVC5XUkFQKTsKLQkJcnVudGltZUluc3RhbExvY2F0aW9uSXRlbS5zZXRUZXh0KEF4aXMyQ29yZVVJTWVzc2FnZXMuQVhJUzJfUlVOVElNRSk7Ci0JCXJ1bnRpbWVJbnN0YWxMb2NhdGlvbkl0ZW0uc2V0VG9vbFRpcFRleHQoQXhpczJDb3JlVUlNZXNzYWdlcy5BWElTMl9SVU5USU1FX1RPT0xUSVApOwotCQkKLQkJQ29tcG9zaXRlIHJ1bnRpbWVUYWIgPSB1aVV0aWxzLmNyZWF0ZUNvbXBvc2l0ZShheGlzMlByZWZlcmVuY2VUYWIsIDEpOwotCQlydW50aW1lVGFiLnNldExheW91dERhdGEoIG5ldyBHcmlkRGF0YShHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMIHwgR3JpZERhdGEuRklMTF9CT1RIICkgKTsKLQkJQ29tcG9zaXRlIHJ1bnRpbWVHcm91cCA9IHVpVXRpbHMuY3JlYXRlQ29tcG9zaXRlKHJ1bnRpbWVUYWIsIDMpOwotCi0JCXJ1bnRpbWVJbnN0YWxMb2NhdGlvbkl0ZW0uc2V0Q29udHJvbChydW50aW1lVGFiKTsKLQkJcnVudGltZVRhYi5zZXRUb29sVGlwVGV4dChBeGlzMkNvcmVVSU1lc3NhZ2VzLkFYSVMyX1JVTlRJTUVfVE9PTFRJUCk7Ci0KLQkJYXhpczJQYXRoID0gdWlVdGlscy5jcmVhdGVUZXh0KHJ1bnRpbWVHcm91cCwgQXhpczJDb3JlVUlNZXNzYWdlcy5BWElTMl9SVU5USU1FX0xPQ0FUSU9OICwgbnVsbCwgbnVsbCAsIFNXVC5CT1JERVIpOwotCQkKLQkJQnV0dG9uIGJyb3dzZUJ1dHRvbiA9IHVpVXRpbHMuY3JlYXRlUHVzaEJ1dHRvbihydW50aW1lR3JvdXAsIEF4aXMyQ29yZVVJTWVzc2FnZXMuTEFCRUxfQlJPVVNFLCBudWxsLCBudWxsKTsKLQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKCBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVCcm93c2UobWFpbkNvbXAuZ2V0U2hlbGwoKSk7Ci0JCQl9ICAgICAKLQkJfSk7IAotCi0JCWF4aXMyUGF0aC5hZGRNb2RpZnlMaXN0ZW5lciggbmV3IE1vZGlmeUxpc3RlbmVyKCl7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpewotCQkJCXN0YXR1c1VwZGF0ZShydW50aW1lRXhpc3QoYXhpczJQYXRoLmdldFRleHQoKSkpOwotCQkJCS8vIHJ1bnRpbWVUYWIubGF5b3V0KCk7Ci0JCQl9Ci0JCX0pOwotCQluZXcgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWwocnVudGltZVRhYiwgU1dULkhPUklaT05UQUwpOyAgLy8gTGVhdmUgc29tZSB2ZXJ0aWNhbCBzcGFjZS4KLQkJc3RhdHVzTGFiZWwgPSBuZXcgVGV4dChydW50aW1lVGFiLCBTV1QuQkFDS0dST1VORCB8IFNXVC5SRUFEX09OTFkgfCBTV1QuQ0VOVEVSIHwgU1dULldSQVAgfCBTV1QuSF9TQ1JPTEwpOwotCQlzdGF0dXNMYWJlbC5zZXRMYXlvdXREYXRhKCBuZXcgR3JpZERhdGEoR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCB8IEdyaWREYXRhLkZJTExfQk9USCkgKTsKLQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tQXhpczIgUnVudGltZSBQcmVmZXJlbmNlcy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCi0KLQkJVGFiSXRlbSBjb2RlZ2VuUHJlZmVyZW5jZXNJdGVtID0gbmV3IFRhYkl0ZW0oYXhpczJQcmVmZXJlbmNlVGFiLCBTV1QuV1JBUCk7Ci0JCWNvZGVnZW5QcmVmZXJlbmNlc0l0ZW0uc2V0VGV4dChBeGlzMkNvcmVVSU1lc3NhZ2VzLkFYSVMyX1BSRUZFUkVOQ0VTKTsKLQkJY29kZWdlblByZWZlcmVuY2VzSXRlbS5zZXRUb29sVGlwVGV4dChBeGlzMkNvcmVVSU1lc3NhZ2VzLkFYSVMyX1BSRUZFUkVOQ0VTX1RPT0xUSVApOwotCi0JCUNvbXBvc2l0ZSBjb2RlZ2VuR3JvdXAgPSB1aVV0aWxzLmNyZWF0ZUNvbXBvc2l0ZShheGlzMlByZWZlcmVuY2VUYWIsIDEpOwotCQljb2RlZ2VuUHJlZmVyZW5jZXNJdGVtLnNldENvbnRyb2woY29kZWdlbkdyb3VwKTsKLQkJY29kZWdlbkdyb3VwLnNldFRvb2xUaXBUZXh0KEF4aXMyQ29yZVVJTWVzc2FnZXMuQVhJUzJfUFJFRkVSRU5DRVNfVE9PTFRJUCk7Ci0KLQkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0JCS8vU2VydmljZSBDb2RlZ2VuIE9wdGlvbnMKLQkJQ29tcG9zaXRlIHNlcnZpY2VDb2RlZ2VuR3JvdXAgPSB1aVV0aWxzLmNyZWF0ZUNvbXBvc2l0ZShjb2RlZ2VuR3JvdXAsIDEpOwotCi0JCVRleHQgc2VydmljZUNvZGVnZW5Hcm91cExhYmVsPSBuZXcgVGV4dChzZXJ2aWNlQ29kZWdlbkdyb3VwLCBTV1QuUkVBRF9PTkxZIHxTV1QuV1JBUCk7Ci0JCXNlcnZpY2VDb2RlZ2VuR3JvdXBMYWJlbC5zZXRUZXh0KEF4aXMyQ29yZVVJTWVzc2FnZXMuTEFCRUxfV0VCX1NFUlZJQ0VfQ09ERUdFTik7Ci0KLQkJQ29tcG9zaXRlIGRhdGFCaW5kQ29tcCA9IHVpVXRpbHMuY3JlYXRlQ29tcG9zaXRlKHNlcnZpY2VDb2RlZ2VuR3JvdXAsIDIpOwotCQkvL0RhdGEgYmluZGluZwotCQlzZXJ2aWNlRGF0YWJpbmRpbmdDb21ibyA9IHVpVXRpbHMuY3JlYXRlQ29tYm8oZGF0YUJpbmRDb21wLCBBeGlzMkNvcmVVSU1lc3NhZ2VzLkxBQkVMX0RBVEFCSU5ESU5HLCBudWxsLCBudWxsLCBTV1QuUkVBRF9PTkxZKTsKLQotCQkvL3RoZSBzZXJ2ZXIgc2lkZSBpbnRlcmZhY2Ugb3B0aW9uCi0JCWdlbmVyYXRlU2VydmVyU2lkZUludGVyZmFjZUNoZWNrQm94QnV0dG9uID0gdWlVdGlscy5jcmVhdGVDaGVja2JveChzZXJ2aWNlQ29kZWdlbkdyb3VwLCBBeGlzMkNvcmVVSU1lc3NhZ2VzLkxBQkVMX0dFTkVSQVRFX1NFUlZFUlNJREVfSU5URVJGQUNFLCBudWxsLCBudWxsKTsKLQotCQkvLyBnZW5lcmF0ZSBhbGwKLQkJZ2VuZXJhdGVBbGxDaGVja0JveEJ1dHRvbiA9IHVpVXRpbHMuY3JlYXRlQ2hlY2tib3goc2VydmljZUNvZGVnZW5Hcm91cCwgQXhpczJDb3JlVUlNZXNzYWdlcy5MQUJFTF9HRU5FUkFURV9BTEwsIG51bGwsbnVsbCk7Ci0KLQkJdWlVdGlscy5jcmVhdGVIb3Jpem9udGFsU2VwYXJhdG9yKGNvZGVnZW5Hcm91cCwyKTsKLQkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0JCS8vL0NsaWVudCBDb2RlZ2VuIE9wdGlvbnMKLQkJQ29tcG9zaXRlIGNsaWVudENvZGVnZW5Hcm91cCA9IHVpVXRpbHMuY3JlYXRlQ29tcG9zaXRlKGNvZGVnZW5Hcm91cCwgMSk7Ci0JCVRleHQgY2xpZW50Q29kZWdlbkdyb3VwTGFiZWw9IG5ldyBUZXh0KGNsaWVudENvZGVnZW5Hcm91cCwgU1dULlJFQURfT05MWSk7Ci0JCWNsaWVudENvZGVnZW5Hcm91cExhYmVsLnNldFRleHQoQXhpczJDb3JlVUlNZXNzYWdlcy5MQUJFTF9XRUJfU0VSVklDRV9DTElFTlRfQ09ERUdFTik7Ci0KLQkJR3JvdXAgY2xpZW50TW9kZVJhZGlvQ29tcCA9IHVpVXRpbHMuY3JlYXRlR3JvdXAoY2xpZW50Q29kZWdlbkdyb3VwLCBBeGlzMkNvcmVVSU1lc3NhZ2VzLkxBQkVMX0NMSUVOVF9TSURFLCBudWxsLCBudWxsKTsKLQotCQkvL2NsaWVudCBzaWRlIGJ1dHRvbnMKLQkJc3luY0FuZEFzeW5jUmFkaW9CdXR0b24gPSB1aVV0aWxzLmNyZWF0ZVJhZGlvQnV0dG9uKGNsaWVudE1vZGVSYWRpb0NvbXAsIEF4aXMyQ29yZVVJTWVzc2FnZXMuTEFCRUxfU1lOQ19BTkRfQVNZTkMsIG51bGwsIG51bGwpOwotCQlzeW5jT25seVJhZGlvQnV0dG9uIAk9IHVpVXRpbHMuY3JlYXRlUmFkaW9CdXR0b24oY2xpZW50TW9kZVJhZGlvQ29tcCxBeGlzMkNvcmVVSU1lc3NhZ2VzLkxBQkVMX1NZTkMsIG51bGwsIG51bGwpOwotCQlhc3luY09ubHlSYWRpb0J1dHRvbiAJPSB1aVV0aWxzLmNyZWF0ZVJhZGlvQnV0dG9uKGNsaWVudE1vZGVSYWRpb0NvbXAsIEF4aXMyQ29yZVVJTWVzc2FnZXMuTEFCRUxfQVNZTkMsIG51bGwsIG51bGwpOwotCi0JCUNvbXBvc2l0ZSBkYXRhQmluZCA9IHVpVXRpbHMuY3JlYXRlQ29tcG9zaXRlKGNsaWVudENvZGVnZW5Hcm91cCwgMik7Ci0JCWNsaWVudERhdGFiaW5kaW5nQ29tYm8gPSB1aVV0aWxzLmNyZWF0ZUNvbWJvKGRhdGFCaW5kLCBBeGlzMkNvcmVVSU1lc3NhZ2VzLkxBQkVMX0RBVEFCSU5ESU5HLCBudWxsLCBudWxsLCBTV1QuUkVBRF9PTkxZKTsKLQotCQkvLyBnZW5lcmF0ZSB0ZXN0IGNhc2Ugb3B0aW9uCi0JCWNsaWVudFRlc3RDYXNlQ2hlY2tCb3hCdXR0b24gPSB1aVV0aWxzLmNyZWF0ZUNoZWNrYm94KGNsaWVudENvZGVnZW5Hcm91cCwgQXhpczJDb3JlVUlNZXNzYWdlcy5MQUJFTF9HRU5FUkFURV9URVNUQ0FTRV9DQVBUSU9OLCBudWxsLCBudWxsKTsKLQotCQkvLyBnZW5lcmF0ZSBhbGwKLQkJY2xpZW50R2VuZXJhdGVBbGxDaGVja0JveEJ1dHRvbiA9IHVpVXRpbHMuY3JlYXRlQ2hlY2tib3goY2xpZW50Q29kZWdlbkdyb3VwLCBBeGlzMkNvcmVVSU1lc3NhZ2VzLkxBQkVMX0dFTkVSQVRFX0FMTCwgbnVsbCwgbnVsbCk7Ci0KLQotCQl1aVV0aWxzLmNyZWF0ZUhvcml6b250YWxTZXBhcmF0b3IoY29kZWdlbkdyb3VwLDIpOwotCi0JCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotCQkvLy9BQVIgT3B0aW9ucwotCQlDb21wb3NpdGUgYWFyR3JvdXAgPSB1aVV0aWxzLmNyZWF0ZUNvbXBvc2l0ZShjb2RlZ2VuR3JvdXAsMSk7Ci0KLQkJVGV4dCBhcnJHcm91cExhYmVsPSBuZXcgVGV4dChhYXJHcm91cCwgU1dULlJFQURfT05MWSk7Ci0JCWFyckdyb3VwTGFiZWwuc2V0VGV4dChBeGlzMkNvcmVVSU1lc3NhZ2VzLkxBQkVMX1dFQl9TRVJWSUNFX0FBUik7Ci0KLQkJQ29tcG9zaXRlIGFhckV4dEdyb3VwID0gdWlVdGlscy5jcmVhdGVDb21wb3NpdGUoYWFyR3JvdXAsMik7Ci0KLQkJLy9hYXIgZXh0ZW50aW9uIAotCQlhYXJFeHRlbnNpb25Db21ibyA9IHVpVXRpbHMuY3JlYXRlQ29tYm8oYWFyRXh0R3JvdXAsIEF4aXMyQ29yZVVJTWVzc2FnZXMuTEFCRUxfQUFSX0VYVEVOVElPTiwgbnVsbCwgbnVsbCwgU1dULlJFQURfT05MWSApOwotCi0JCWluaXRpYWxpemVWYWx1ZXMoKTsKLQkJYXhpczJQcmVmZXJlbmNlVGFiLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCWF4aXMyUHJlZmVyZW5jZVRhYi5zZXRWaXNpYmxlKHRydWUpOwotCQlyZXR1cm4gbWFpbkNvbXA7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCX0KLQotCi0JLyoqCi0JICogUG9wcyB1cCB0aGUgZmlsZSBicm93c2UgZGlhbG9nIGJveAotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVCcm93c2UoU2hlbGwgcGFyZW50KSB7Ci0JCURpcmVjdG9yeURpYWxvZyBmaWxlRGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyhwYXJlbnQpOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBmaWxlRGlhbG9nLm9wZW4oKTsKLQkJaWYgKGZpbGVOYW1lICE9IG51bGwpIHsKLQkJCWF4aXMyUGF0aC5zZXRUZXh0KGZpbGVOYW1lKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzdGF0dXNVcGRhdGUoYm9vbGVhbiBzdGF0dXMpewotCQlpZihzdGF0dXNMYWJlbCAhPSBudWxsKXsKLQkJCWlmKCFheGlzMlBhdGguZ2V0VGV4dCgpLmVxdWFscygiIikpewotCQkJCWlmIChzdGF0dXMpIHsKLQkJCQkJc3RhdHVzTGFiZWwuc2V0VGV4dChBeGlzMkNvcmVVSU1lc3NhZ2VzLkxBQkVMX0FYSVMyX1JVTlRJTUVfTE9BRCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc3RhdHVzTGFiZWwuc2V0VGV4dChBeGlzMkNvcmVVSU1lc3NhZ2VzLkxBQkVMX0FYSVMyX1JVTlRJTUVfTE9BRF9FUlJPUik7Ci0JCQkJfQotCQkJfWVsc2V7Ci0JCQkJc3RhdHVzTGFiZWwuc2V0VGV4dChBeGlzMkNvcmVVSU1lc3NhZ2VzLkxBQkVMX0FYSVMyX1JVTlRJTUVfTk9UX0VYSVQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHJ1bnRpbWVFeGlzdChTdHJpbmcgcGF0aCl7Ci0KLQkJRmlsZSBheGlzMkhvbWVEaXIgPSBuZXcgRmlsZShwYXRoKTsKLQkJaWYgKCFheGlzMkhvbWVEaXIuaXNEaXJlY3RvcnkoKSkgCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJU3RyaW5nIGF4aXMyTGliUGF0aCA9IEF4aXMyQ29yZVV0aWxzLmFkZEFub3RoZXJOb2RlVG9QYXRoKGF4aXMySG9tZURpci5nZXRBYnNvbHV0ZVBhdGgoKSwgImxpYiIpOwotCQlTdHJpbmcgYXhpczJXZWJhcHBQYXRoID0gQXhpczJDb3JlVXRpbHMuYWRkQW5vdGhlck5vZGVUb1BhdGgoYXhpczJIb21lRGlyLmdldEFic29sdXRlUGF0aCgpLCAid2ViYXBwIik7Ci0JCWlmIChuZXcgRmlsZShheGlzMkxpYlBhdGgpLmlzRGlyZWN0b3J5KCkgJiYgbmV3IEZpbGUoYXhpczJXZWJhcHBQYXRoKS5pc0RpcmVjdG9yeSgpKSAKLQkJCXJldHVybiB0cnVlOwotCQllbHNlIHsKLQkJCVN0cmluZyBheGlzMldhclBhdGggPSBBeGlzMkNvcmVVdGlscy5hZGRBbm90aGVyTm9kZVRvUGF0aCggcGF0aCwgImF4aXMyLndhciIpOwotCQkJaWYgKG5ldyBGaWxlKGF4aXMyV2FyUGF0aCkuaXNGaWxlKCkpIHsKLQkJCQlSdW50aW1lUHJvcGVydHlVdGlscy53cml0ZVdhclN0YXVzVG9Qcm9wZXJ0aWVzRmlsZSh0cnVlKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSAJCQkJCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0b3JlVmFsdWVzKCl7Ci0JCS8vIHNldCB2YWx1ZXMgaW4gdGhlIHBlcnNpc3RlbnQgY29udGV4dCAKLQkJQXhpczJFbWl0dGVyQ29udGV4dCBjb250ZXh0ID0gV2ViU2VydmljZUF4aXMyQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QXhpc0VtaXR0ZXJDb250ZXh0KCk7Ci0JCWNvbnRleHQuc2V0QXhpczJSdW50aW1lTG9jYXRpb24oIGF4aXMyUGF0aC5nZXRUZXh0KCkpOwotCQlSdW50aW1lUHJvcGVydHlVdGlscy53cml0ZVNlcnZlclBhdGhUb1Byb3BlcnRpZXNGaWxlKGF4aXMyUGF0aC5nZXRUZXh0KCkpOwotCQljb250ZXh0LnNldFNlcnZpY2VEYXRhYmluZGluZyhzZXJ2aWNlRGF0YWJpbmRpbmdDb21iby5nZXRJdGVtKHNlcnZpY2VEYXRhYmluZGluZ0NvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpKTsKLQkJY29udGV4dC5zZXRTZXJ2aWNlSW50ZXJmYWNlU2tlbGV0b24oIGdlbmVyYXRlU2VydmVyU2lkZUludGVyZmFjZUNoZWNrQm94QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJY29udGV4dC5zZXRTZXJ2aWNlR2VuZXJhdGVBbGwoZ2VuZXJhdGVBbGxDaGVja0JveEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCWNvbnRleHQuc2V0QXN5bmMoYXN5bmNPbmx5UmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQljb250ZXh0LnNldFN5bmMoc3luY09ubHlSYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCWNvbnRleHQuc2V0Q2xpZW50RGF0YWJpbmRpbmcoY2xpZW50RGF0YWJpbmRpbmdDb21iby5nZXRJdGVtKGNsaWVudERhdGFiaW5kaW5nQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSkpOwotCQljb250ZXh0LnNldENsaWVudFRlc3RDYXNlKGNsaWVudFRlc3RDYXNlQ2hlY2tCb3hCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQljb250ZXh0LnNldENsaWVudEdlbmVyYXRlQWxsKGNsaWVudEdlbmVyYXRlQWxsQ2hlY2tCb3hCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQljb250ZXh0LnNldEFhckV4dGVudGlvbihhYXJFeHRlbnNpb25Db21iby5nZXRUZXh0KCkpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHN0YXRlcyBvZiB0aGUgY29udHJvbHMgdXNpbmcgZGVmYXVsdCB2YWx1ZXMKLQkgKiBpbiB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRzKCkgewotCQlhYXJFeHRlbnNpb25Db21iby5zZWxlY3QoMCk7Ci0JCXNlcnZpY2VEYXRhYmluZGluZ0NvbWJvLnNlbGVjdCgwKTsKLQkJY2xpZW50RGF0YWJpbmRpbmdDb21iby5zZWxlY3QoMCk7Ci0JCWdlbmVyYXRlU2VydmVyU2lkZUludGVyZmFjZUNoZWNrQm94QnV0dG9uLnNldFNlbGVjdGlvbihBeGlzMkVtaXR0ZXJEZWZhdWx0cy5pc1NlcnZpY2VJbnRlcmZhY2VTa2VsZXRvbigpKTsKLQkJZ2VuZXJhdGVBbGxDaGVja0JveEJ1dHRvbi5zZXRTZWxlY3Rpb24oQXhpczJFbWl0dGVyRGVmYXVsdHMuaXNTZXJ2aWNlR2VuZXJhdGVBbGwoKSk7Ci0JCXN5bmNBbmRBc3luY1JhZGlvQnV0dG9uLnNldFNlbGVjdGlvbigoKEF4aXMyRW1pdHRlckRlZmF1bHRzLmlzQ2xpZW50U3luYygpIHx8IEF4aXMyRW1pdHRlckRlZmF1bHRzLmlzQ2xpZW50QXN5bmMoKSk9PWZhbHNlKT90cnVlOgotCQkJKEF4aXMyRW1pdHRlckRlZmF1bHRzLmlzQ2xpZW50U3luYygpKSAmJiBBeGlzMkVtaXR0ZXJEZWZhdWx0cy5pc0NsaWVudEFzeW5jKCkpOwotCQlzeW5jT25seVJhZGlvQnV0dG9uLnNldFNlbGVjdGlvbiggQXhpczJFbWl0dGVyRGVmYXVsdHMuaXNDbGllbnRTeW5jKCkgJiYgIUF4aXMyRW1pdHRlckRlZmF1bHRzLmlzQ2xpZW50QXN5bmMoKSk7Ci0JCWFzeW5jT25seVJhZGlvQnV0dG9uLnNldFNlbGVjdGlvbigKLQkJCQlBeGlzMkVtaXR0ZXJEZWZhdWx0cy5pc0NsaWVudEFzeW5jKCkgJiYgIUF4aXMyRW1pdHRlckRlZmF1bHRzLmlzQ2xpZW50U3luYygpKTsKLQotCQljbGllbnRUZXN0Q2FzZUNoZWNrQm94QnV0dG9uLnNldFNlbGVjdGlvbihBeGlzMkVtaXR0ZXJEZWZhdWx0cy5pc0NsaWVudFRlc3RDYXNlKCkpOwotCQljbGllbnRHZW5lcmF0ZUFsbENoZWNrQm94QnV0dG9uLnNldFNlbGVjdGlvbihBeGlzMkVtaXR0ZXJEZWZhdWx0cy5pc0NsaWVudEdlbmVyYXRlQWxsKCkpOwotCQlheGlzMlBhdGguc2V0VGV4dChBeGlzMkVtaXR0ZXJEZWZhdWx0cy5nZXRBeGlzMlJ1bnRpbWVMb2NhdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZhbHVlcygpCi0JewotCQlBeGlzMkVtaXR0ZXJDb250ZXh0IGNvbnRleHQgPSBXZWJTZXJ2aWNlQXhpczJDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRBeGlzRW1pdHRlckNvbnRleHQoKTsKLQotCQlTdHJpbmdbXSBkYXRhYmluZGluZ0l0ZW1zID0ge2NvbnRleHQuZ2V0U2VydmljZURhdGFiaW5kaW5nKCkudG9VcHBlckNhc2UoKX07Ci0JCXNlcnZpY2VEYXRhYmluZGluZ0NvbWJvLnNldEl0ZW1zKGRhdGFiaW5kaW5nSXRlbXMpOwotCQlzZXJ2aWNlRGF0YWJpbmRpbmdDb21iby5zZWxlY3QoMCk7Ci0JCWNsaWVudERhdGFiaW5kaW5nQ29tYm8uc2V0SXRlbXMoZGF0YWJpbmRpbmdJdGVtcyk7Ci0JCWNsaWVudERhdGFiaW5kaW5nQ29tYm8uc2VsZWN0KDApOwotCi0JCWdlbmVyYXRlU2VydmVyU2lkZUludGVyZmFjZUNoZWNrQm94QnV0dG9uLnNldFNlbGVjdGlvbiggY29udGV4dC5pc1NlcnZpY2VJbnRlcmZhY2VTa2VsZXRvbigpKTsKLQkJZ2VuZXJhdGVBbGxDaGVja0JveEJ1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc1NlcnZpY2VHZW5lcmF0ZUFsbCgpKTsKLQotCQlzeW5jQW5kQXN5bmNSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24oKChjb250ZXh0LmlzU3luYygpIHx8IGNvbnRleHQuaXNBc3luYygpKT09ZmFsc2UpID90cnVlCi0JCQkJOihjb250ZXh0LmlzU3luYygpKSAmJiBjb250ZXh0LmlzQXN5bmMoKSk7Ci0JCXN5bmNPbmx5UmFkaW9CdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNTeW5jKCkgJiYgIWNvbnRleHQuaXNBc3luYygpICk7Ci0JCWFzeW5jT25seVJhZGlvQnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzQXN5bmMoKSAmJiAhY29udGV4dC5pc1N5bmMoKSk7Ci0KLQkJY2xpZW50VGVzdENhc2VDaGVja0JveEJ1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc0NsaWVudFRlc3RDYXNlKCkpOwotCQljbGllbnRHZW5lcmF0ZUFsbENoZWNrQm94QnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzQ2xpZW50R2VuZXJhdGVBbGwoKSk7Ci0KLQkJU3RyaW5nW10gYWFyRXh0ZW50aW9uSXRlbXMgPSB7IEF4aXMyQ29uc3RhbnRzLkFBUiB9OwotCQlhYXJFeHRlbnNpb25Db21iby5zZXRJdGVtcyhhYXJFeHRlbnRpb25JdGVtcyk7Ci0JCWFhckV4dGVuc2lvbkNvbWJvLnNlbGVjdCgwKTsKLQkJCi0JCVN0cmluZyBzZXJ2ZXJQYXRoID0gY29udGV4dC5nZXRBeGlzMlJ1bnRpbWVMb2NhdGlvbigpOwotCQlpZiAoIHNlcnZlclBhdGggIT0gbnVsbCl7Ci0JCQlheGlzMlBhdGguc2V0VGV4dChzZXJ2ZXJQYXRoKTsKLQkJCXN0YXR1c1VwZGF0ZShydW50aW1lRXhpc3Qoc2VydmVyUGF0aCkpOwotCQkJUnVudGltZVByb3BlcnR5VXRpbHMud3JpdGVXYXJTdGF1c1RvUHJvcGVydGllc0ZpbGUoZmFsc2UpOwotCQl9Ci0JCWVsc2UKLQkJCXN0YXR1c1VwZGF0ZShmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBidXR0b24gaGFzIGJlZW4gcHJlc3NlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCQlpbml0aWFsaXplRGVmYXVsdHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBBcHBseSBidXR0b24gaGFzIGJlZW4gcHJlc3NlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtQXBwbHkoKSB7Ci0JCXBlcmZvcm1PaygpOwotCX0KLQotCS8qKgotCSAqIE9LIGJ1dHRvbiBoYXMgYmVlbiBwcmVzc2VkLgotCSAqLwkKLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCXN0b3JlVmFsdWVzKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvLmN2c2lnbm9yZSBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMDE1OTIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyXyoKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvLnByb2plY3QgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS5kb2MudXNlci8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJjMDMwZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS5kb2MudXNlci8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS5kb2MudXNlcjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyL0RvY0J1aWxkLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyL0RvY0J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUyYzRkNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS5kb2MudXNlci9Eb2NCdWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KLTwhLS0gCi0KLQlUaGlzIHNjcmlwdCBidWlsZCB0aGUgSGVscCBwbHVnLWluIGJ5IHRyYW5zZm9ybWluZyB0aGUgRElUQSBzb3VyY2UgZmlsZXMgaW50byBIVE1MLgotCQotCVRvIHVzZSB0aGlzIHNjcmlwdCwgeW91IG11c3QgaW5zdGFsbCBESVRBLU9UIG9uIHlvdXIgbWFjaGluZSBpbiB0aGUgZGlyZWN0b3J5Ci0JZGVmaW5lZCBieSB0aGUgZGl0YS5vdC5kaXIgcHJvcGVydHkuCi0JCi0JUnVuIHRoZSBkZWZhdWx0IHRhcmdldCBhZnRlciB5b3UgZWRpdCB0aGUgRElUQSBzb3VyY2UgZmlsZXMgdG8gcmVnZW5lcmF0ZSB0aGUgSFRNTC4KLQkKLQlUbyBjdXN0b21pemUgdGhpcyBzY3JpcHQgZm9yIG90aGVyIEhlbHAgcGx1Zy1pbnMsIG1vZGlmeSB0aGUgdmFsdWUgb2YgdGhlIGFyZ3MuaW5wdXQgcHJvcGVydHkKLQl0byBiZSB0aGUgRElUQSBtYXAgZmlsZSBmb3IgdGhlIHBsdWctaW4uCi0JCi0JTk9URTogVGhpcyBzY3JpcHQgYXNzdW1lcyB0aGF0IGxpbmtzIHRvIHNpYmxpbmcgSGVscCBwbHVnLWlucyBoYXZlIHNjb3BlPSJwZWVyIiwgb3RoZXJ3aXNlIHRoZQotCW91dHB1dCBkaXJlY3Rvcnkgc3RydWN0dXJlIHdpbGwgYmUgc2hpZnRlZCBpbmNvcnJlY3RseS4KLQkKLQlOT1RFOiBUaGlzIHNjcmlwdCBhc3N1bWVzIHRoYXQgeW91IGhhbmQgY29kZSB5b3VyIHBsdWdpbi54bWwgZmlsZSBpbiBteXBsdWdpbi54bWwuIFRoaXMgZmlsZQotCXdpbGwgYmUgY29waWVkIG92ZXIgdGhlIGdlbmVyYXRlZCBwbHVnaW4ueG1sIHdoaWNoIGlzIGN1cnJlbnRseSBub3QgYmVpbmcgZ2VuZXJhdGVkIGNvcnJlY3RseQotCWJ5IERJVEEtT1QuCi0JCi0JQ2hhbmdlTG9nOgotCTIwMDYtMDQtMDUgQXJ0aHVyIFJ5bWFuIDxyeW1hbkBjYS5pYm0uY29tPgotCS0gQ3JlYXRlZC4KLQkyMDA4LTAxLTA5IEthdGUgUHJpY2UgPGthdGVwQGNhLmlibS5jb20+Ci0JLSBtb2RpZmllZCBmb3IgbmV3IERJVEEtT1QgdmVyc2lvbgotLS0+Ci08cHJvamVjdCBuYW1lPSJlY2xpcHNlaGVscCIgZGVmYXVsdD0iYWxsIj4KLQotCTxwcm9wZXJ0eSBuYW1lPSJkaXRhLm90LmRpciIgbG9jYXRpb249IkM6L0RJVEEtT1QxLjIuMiIgLz4KLQotCTxwYXRoIGlkPSJkb3N0LmNsYXNzLnBhdGgiPgotCQk8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7ZGl0YS5vdC5kaXJ9JHtmaWxlLnNlcGFyYXRvcn1saWIke2ZpbGUuc2VwYXJhdG9yfWRvc3QuamFyIiAvPgotCTwvcGF0aD4KLQotCTx0YXNrZGVmIG5hbWU9ImludGVncmF0ZSIgY2xhc3NuYW1lPSJvcmcuZGl0YS5kb3N0LnBsYXRmb3JtLkludGVncmF0b3JUYXNrIj4KLQkJPGNsYXNzcGF0aCByZWZpZD0iZG9zdC5jbGFzcy5wYXRoIiAvPgotCTwvdGFza2RlZj4KLQk8dGFyZ2V0IG5hbWU9ImFsbCIgZGVwZW5kcz0iaW50ZWdyYXRlLCBlY2xpcHNlaGVscCI+Ci0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJpbnRlZ3JhdGUiPgotCQk8aW50ZWdyYXRlIGRpdGFkaXI9IiR7ZGl0YS5vdC5kaXJ9IiAvPgotCTwvdGFyZ2V0PgotCi0JPCEtLSByZXZpc2UgYmVsb3cgaGVyZSAtLT4KLQk8dGFyZ2V0IG5hbWU9ImVjbGlwc2VoZWxwIj4KLQkJPGFudCBhbnRmaWxlPSIke2RpdGEub3QuZGlyfSR7ZmlsZS5zZXBhcmF0b3J9Y29uZHVjdG9yLnhtbCIgdGFyZ2V0PSJpbml0IiBkaXI9IiR7ZGl0YS5vdC5kaXJ9Ij4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzLmNvcHljc3MiIHZhbHVlPSJubyIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzLmNzc3BhdGgiIHZhbHVlPSIuLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIiIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0iYXJncy5lY2xpcHNlLnByb3ZpZGVyIiB2YWx1ZT0iRWNsaXBzZS5vcmciIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0iYXJncy5lY2xpcHNlLnZlcnNpb24iIHZhbHVlPSIzLjAuMCIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzLmlucHV0IiBsb2NhdGlvbj0id3NheGlzMl9yZWx0YWJsZV90b2MuZGl0YW1hcCIgLz4gICAKLQkJCTxwcm9wZXJ0eSBuYW1lPSJjbGVhbi50ZW1wIiB2YWx1ZT0idHJ1ZSIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJkaXRhLmV4dG5hbWUiIHZhbHVlPSIuZGl0YSIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJkaXRhLnRlbXAuZGlyIiBsb2NhdGlvbj0idGVtcCIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJvdXRwdXQuZGlyIiBsb2NhdGlvbj0iIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9InRyYW5zdHlwZSIgdmFsdWU9ImVjbGlwc2VoZWxwIiAvPgotCQk8L2FudD4KLQkJPGNvcHkgZmlsZT0ibXlwbHVnaW4ueG1sIiB0b2ZpbGU9InBsdWdpbi54bWwiIG92ZXJ3cml0ZT0ieWVzIiAvPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE2MGQ4MC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS5kb2MudXNlcjtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS5kb2MudXNlci9hYm91dC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNkYjM2ZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS5kb2MudXNlci9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI0YWQ5Mi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICB3c2F4aXMyYnVpbGRfdG9jLnhtbCxcCi0gICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXJpbmRleC54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgdG9waWNzLwotc3JjLmluY2x1ZGVzID0gYnVpbGQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICAqLm1hcGxpc3QsXAotICAgICAgICAgICAgICAgKi5kaXRhbWFwLFwKLSAgICAgICAgICAgICAgIHRvcGljcy8sXAotICAgICAgICAgICAgICAgd3NheGlzMmJ1aWxkX3RvYy54bWwsXAotICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyaW5kZXgueG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sCi1iaW4uZXhjbHVkZXMgPSBEb2NCdWlsZC54bWwsXAotICAgICAgICAgICAgICAgbXlQbHVnaW4qLnhtbCxcCi0gICAgICAgICAgICAgICB0b3BpY3MvKi5kaXRhCi0gICAgICAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS5kb2MudXNlci9teXBsdWdpbi54bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS5kb2MudXNlci9teXBsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyODc1MzYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvbXlwbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+IAotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPHBsdWdpbj4KLSAgCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC50b2MiPgotCQk8dG9jIGZpbGU9IndzYXhpczJidWlsZF90b2MueG1sIiAvPgotICAgICAgIDxpbmRleCBwYXRoPSJpbmRleC8iLz4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmluZGV4Ij4KLSAgICAgIDxpbmRleCBmaWxlPSJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXJpbmRleC54bWwiLz4KLTwvZXh0ZW5zaW9uPgotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAuYmFzZS5sdWNlbmVTZWFyY2hQYXJ0aWNpcGFudHMiPgotICAgICAgPGJpbmRpbmcgcGFydGljaXBhbnRJZD0ib3JnLmVjbGlwc2UuaGVscC5iYXNlLnhodG1sIi8+Ci0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS5kb2MudXNlci5tYXBsaXN0IGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyLm1hcGxpc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMDdhOTYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyLm1hcGxpc3QKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTxtYXBsaXN0IHZlcnNpb249IjMuNi4yIj4NCi0gIDxuYXY+DQotICAgIDxtYXAgZmlsZT0id3NheGlzYnVpbGRfdG9jLmRpdGFtYXAiLz4NCi0gIDwvbmF2Pg0KLSAgPGxpbms+DQotICAgIDxtYXAgZmlsZT0id3NheGlzYnVpbGRfdG9jLmRpdGFtYXAiLz4NCi0gIDwvbGluaz4NCi08L21hcGxpc3Q+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyaW5kZXgueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyaW5kZXgueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGJjNDNkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS5kb2MudXNlcmluZGV4LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08aW5kZXg+Ci0gIDxlbnRyeSBrZXl3b3JkPSJBeGlzIHJ1bnRpbWUgZW52aXJvbm1lbnQiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJXZWIgc2VydmljZXMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9Im92ZXJ2aWV3Ij4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jYXhpczJ0b3Zlci5odG1sI2F4aXNvdmVydmlldyIgdGl0bGU9IkNyZWF0aW5nIFdlYiBzZXJ2aWNlcyB3aXRoIHRoZSBBcGFjaGUgQXhpczIgcnVudGltZSBlbnZpcm9ubWVudHMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IldlYiBzZXJ2aWNlcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkF4aXMgcnVudGltZSBlbnZpcm9ubWVudCI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL2NheGlzMnRvdmVyLmh0bWwjYXhpc292ZXJ2aWV3IiB0aXRsZT0iQ3JlYXRpbmcgV2ViIHNlcnZpY2VzIHdpdGggdGhlIEFwYWNoZSBBeGlzMiBydW50aW1lIGVudmlyb25tZW50cyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkF4aXMyIHJ1bnRpbWUgZW52aXJvbm1lbnQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9ImNyZWF0aW5nIGEgV2ViIHNlcnZpY2UiPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RheGlzMmJ1Lmh0bWwjdHdzYmVhbmEiIHRpdGxlPSJDcmVhdGluZyBhIFdlYiBzZXJ2aWNlIGZyb20gYSBKYXZhIGJlYW4gdXNpbmcgdGhlIEFwYWNoZSBBeGlzMiBydW50aW1lIGVudmlyb25tZW50Ii8+Ci0gICAgICA8L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9InNrZWxldG9uIFdlYiBzZXJ2aWNlcyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGF4aXMydGQuaHRtbCN0c2tsd3NkbGEiIHRpdGxlPSJDcmVhdGluZyBhIEphdmEgYmVhbiBza2VsZXRvbiBmcm9tIGEgV1NETCBkb2N1bWVudCB1c2luZyB0aGUgQXBhY2hlIEF4aXMyIHJ1bnRpbWUgZW52aXJvbm1lbnQiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iV2ViIHNlcnZpY2UgY2xpZW50cyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGF4aXMyY2xpZW50Lmh0bWwjdHNhbXBhcHBhIiB0aXRsZT0iR2VuZXJhdGluZyBhIEphdmEgY2xpZW50IHByb3h5IGFuZCBhIHNhbXBsZSBhcHBsaWNhdGlvbiBmcm9tIGEgV1NETCBkb2N1bWVudCB1c2luZyB0aGUgQXhpczIgcnVudGltZSBlbnZpcm9ubWVudCIvPgotICAgICAgPC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQXhpczIgcnVudGltZSBlbnZpcm9ubWVudCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IldlYiBzZXJ2aWNlcyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iSmF2YSBiZWFucyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGF4aXMyYnUuaHRtbCN0d3NiZWFuYSIgdGl0bGU9IkNyZWF0aW5nIGEgV2ViIHNlcnZpY2UgZnJvbSBhIEphdmEgYmVhbiB1c2luZyB0aGUgQXBhY2hlIEF4aXMyIHJ1bnRpbWUgZW52aXJvbm1lbnQiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ic2tlbGV0b24gV2ViIHNlcnZpY2VzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGF4aXMydGQuaHRtbCN0c2tsd3NkbGEiIHRpdGxlPSJDcmVhdGluZyBhIEphdmEgYmVhbiBza2VsZXRvbiBmcm9tIGEgV1NETCBkb2N1bWVudCB1c2luZyB0aGUgQXBhY2hlIEF4aXMyIHJ1bnRpbWUgZW52aXJvbm1lbnQiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJXZWIgc2VydmljZSBjbGllbnRzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGF4aXMyY2xpZW50Lmh0bWwjdHNhbXBhcHBhIiB0aXRsZT0iR2VuZXJhdGluZyBhIEphdmEgY2xpZW50IHByb3h5IGFuZCBhIHNhbXBsZSBhcHBsaWNhdGlvbiBmcm9tIGEgV1NETCBkb2N1bWVudCB1c2luZyB0aGUgQXhpczIgcnVudGltZSBlbnZpcm9ubWVudCIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci08L2luZGV4PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiY2JmMWEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIgCi0jIE5MU19FTkNPRElORz1VVEYtOCAKLQotcGx1Z2luTmFtZSA9IEF4aXMyIFdlYiBzZXJ2aWNlcyBkb2N1bWVudGF0aW9uCi1wbHVnaW5Qcm92aWRlciA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS5kb2MudXNlci9wbHVnaW4ueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI4NzUzNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS5kb2MudXNlci9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+IAotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPHBsdWdpbj4KLSAgCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC50b2MiPgotCQk8dG9jIGZpbGU9IndzYXhpczJidWlsZF90b2MueG1sIiAvPgotICAgICAgIDxpbmRleCBwYXRoPSJpbmRleC8iLz4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmluZGV4Ij4KLSAgICAgIDxpbmRleCBmaWxlPSJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXJpbmRleC54bWwiLz4KLTwvZXh0ZW5zaW9uPgotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAuYmFzZS5sdWNlbmVTZWFyY2hQYXJ0aWNpcGFudHMiPgotICAgICAgPGJpbmRpbmcgcGFydGljaXBhbnRJZD0ib3JnLmVjbGlwc2UuaGVscC5iYXNlLnhodG1sIi8+Ci0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyL3RvcGljcy9jYXhpczJ0b3Zlci5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvdG9waWNzL2NheGlzMnRvdmVyLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4Y2RiODAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvdG9waWNzL2NheGlzMnRvdmVyLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIGNvbmNlcHQgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgQ29uY2VwdC8vRU4iDQotICJjb25jZXB0LmR0ZCI+DQotPGNvbmNlcHQgaWQ9ImF4aXNvdmVydmlldyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+Q3JlYXRpbmcgV2ViIHNlcnZpY2VzIHdpdGggdGhlIEFwYWNoZSBBeGlzMiBydW50aW1lIGVudmlyb25tZW50czwvdGl0bGU+DQotPHNob3J0ZGVzYz5UaGlzIHJ1bnRpbWUgZW52aXJvbm1lbnQgaXMgZm9yIHVzZXJzIHdobyBwcmVmZXIgdG8gZGV2ZWxvcCBmb3INCi10aGUgb3BlbiBBcGFjaGUgQXhpcyBwbGF0Zm9ybS4gQm90aCBBeGlzMSBhbmQgQXhpczIgYXJlIHN1cHBvcnRlZCBieSB0aGUgV2ViDQotc2VydmljZXMgdG9vbHMuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+QXhpcyBydW50aW1lIGVudmlyb25tZW50PGluZGV4dGVybT5XZWIgc2VydmljZXM8aW5kZXh0ZXJtPm92ZXJ2aWV3PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5XZWIgc2VydmljZXM8aW5kZXh0ZXJtPkF4aXMgcnVudGltZSBlbnZpcm9ubWVudDwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08Y29uYm9keT4NCi08c2VjdGlvbj48dGl0bGU+QXBhY2hlIEF4aXMyIE92ZXJ2aWV3PC90aXRsZT48cD5BeGlzMiBldm9sdmVkIGZyb20gdGhlIEFwYWNoZQ0KLUF4aXMxLnggYXJjaGl0ZWN0dXJlIGFuZCBpcyBtb3JlIGZsZXhpYmxlLCBjb25maWd1cmFibGUsIGFuZCBlZmZpY2llbnQsIHdoaWxlDQotcmV0YWluaW5nIHRoZSBwb3NpdGl2ZSBhc3BlY3RzIG9mIEFwYWNoZSBBeGlzMS54IGFyY2hpdGVjdHVyZS48L3A+PHA+VGhlIFdlYg0KLXNlcnZpY2UgdG9vbHMgcHJvdmlkZWQgd2l0aCB0aGlzIHByb2R1Y3Qgc3VwcG9ydCB0aGUgZm9sbG93aW5nIHNwZWNpZmljYXRpb25zDQotd2hlbiBjcmVhdGluZyBBcGFjaGUgQXhpczIgV2ViIHNlcnZpY2VzIGFuZCBjbGllbnRzOjx1bD4NCi08bGk+U09BUCAxLjEgYW5kIDEuMjwvbGk+DQotPGxpPldTREwgMS4xLCBpbmNsdWRpbmcgYm90aCBTT0FQIGFuZCBIVFRQIGJpbmRpbmdzIDwvbGk+DQotPGxpPkhUVFAgdHJhbnNwb3J0czwvbGk+DQotPC91bD5UaGUgbGV2ZWxzIG9mIEF4aXMyIGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgdGhlIHRvb2xzIGlzIDEuMiBhbmQgMS4zLg0KLUF4aXMyIGNhbiBiZSBkZXBsb3llZCB0byBhbnkgc2VydmVyIHRoYXQgc3VwcG9ydHMgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gU2VydmxldCAyLjIgc3BlY2lmaWNhdGlvbiBvciBoaWdoZXIsDQotaW5jbHVkaW5nIDx0bSB0bWNsYXNzPSJpYm0iIHRtb3duZXI9IklCTSBDb3Jwb3JhdGlvbiIgdG10eXBlPSJyZWciIHRyYWRlbWFyaz0iSUJNIj5JQk08L3RtPiA8dG0NCi10bWNsYXNzPSJpYm0iIHRtb3duZXI9IklCTSBDb3Jwb3JhdGlvbiIgdG10eXBlPSJyZWciIHRyYWRlbWFyaz0iV2ViU3BoZXJlIj5XZWJTcGhlcmU8L3RtPiBBcHBsaWNhdGlvbg0KLVNlcnZlciA2LjEsIGFuZCBBcGFjaGUgVG9tY2F0IHNlcnZlci4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gQXhpczIsIHJlZmVyDQotdG8gPHhyZWYgZm9ybWF0PSJodG1sIiBocmVmPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi8iIHNjb3BlPSJleHRlcm5hbCI+aHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczI8L3hyZWY+LiA8L3A+PHA+VGhlDQotc3VwcG9ydCBmb3IgQXBhY2hlIEF4aXMyIGlzIGxpbWl0ZWQgdG8gdmFsaWRhdGlvbiB0aGF0IHRoZSBhcHBsaWNhdGlvbiBpcw0KLWludm9raW5nIHRoZSBBeGlzMiBlbWl0dGVycyBjb3JyZWN0bHkuIFN1cHBvcnQgZm9yIG90aGVyIEF4aXMyIGlzc3VlcyBzaG91bGQNCi1iZSBkaXJlY3RlZCB0byA8eHJlZiBmb3JtYXQ9Imh0bWwiIGhyZWY9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyLyIgc2NvcGU9ImV4dGVybmFsIj5odHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMjwveHJlZj48L3A+PC9zZWN0aW9uPg0KLTxzZWN0aW9uPjx0aXRsZT5JbnN0YWxsaW5nIHRoZSBBcGFjaGUgQXhpczIgcnVudGltZTwvdGl0bGU+PHA+VW5saWtlIGNyZWF0aW5nDQotV2ViIHNlcnZpY2VzIGluIHRoZSBBcGFjaGUgQXhpczEueCBydW50aW1lLCBiZWZvcmUgY3JlYXRpbmcgYSBXZWIgc2VydmljZQ0KLXVzaW5nIEFwYWNoZSBBeGlzMiB5b3UgbXVzdCBkb3dubG9hZCB0aGUgQXhpczIgcnVudGltZSBhbmQgaW5zdGFsbCBpdCB0aGUNCi13b3JrYmVuY2ggdXNpbmcgdGhlIFdlYiBzZXJ2aWNlcyBBeGlzMiBwcmVmZXJlbmNlcyBwYWdlLjxvbD4NCi08bGk+RG93bmxvYWQgQXBhY2hlIEF4aXMyIHYxLjIgb3IgdjEuMyBmcm9tIHRoZSBmb2xsb3dpbmcgc2l0ZTogPHhyZWYgZm9ybWF0PSJodG1sIg0KLWhyZWY9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL2Rvd25sb2FkLmNnaSIgc2NvcGU9ImV4dGVybmFsIj5odHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9kb3dubG9hZC5jZ2k8L3hyZWY+LjwvbGk+DQotPGxpPkZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zIGluIHRoZSBhcHByb3ByaWF0ZSBBcGFjaGUgQXhpczIgaW5zdGFsbGF0aW9uIGd1aWRlOiA8dWw+DQotPGxpPkFwYWNoZSBBeGlzMiB2MS4yPHhyZWYgZm9ybWF0PSJodG1sIiBocmVmPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi8xXzIvaW5zdGFsbGF0aW9uZ3VpZGUuaHRtbCINCi1zY29wZT0iZXh0ZXJuYWwiPmh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyLzFfMi9pbnN0YWxsYXRpb25ndWlkZS5odG1sPC94cmVmPjwvbGk+DQotPGxpPkFwYWNoZSBBeGlzMiB2MS4zPHhyZWYgZm9ybWF0PSJodG1sIiBocmVmPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi8xXzMvaW5zdGFsbGF0aW9uZ3VpZGUuaHRtbCINCi1zY29wZT0iZXh0ZXJuYWwiPmh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyLzFfMy9pbnN0YWxsYXRpb25ndWlkZS5odG1sPC94cmVmPjwvbGk+DQotPC91bD48L2xpPg0KLTxsaT5PbmNlIHRoZSBBcGFjaGUgQXhpczIgcnVudGltZSBpcyBpbnN0YWxsZWQsIHlvdSBuZWVkIHRvIGFzc29jaWF0ZSBpdCB3aXRoDQotdGhlIHdvcmtiZW5jaC4gSW4gdGhlIHdvcmtiZW5jaCwgb3BlbiA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5XaW5kb3c8L3VpY29udHJvbD4NCi08dWljb250cm9sPlByZWZlcmVuY2VzPC91aWNvbnRyb2w+PHVpY29udHJvbD5XZWIgc2VydmljZXM8L3VpY29udHJvbD48dWljb250cm9sPkF4aXMyDQotUHJlZmVyZW5jZXM8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi4gT24gdGhlIDx1aWNvbnRyb2w+QXhpczIgUnVudGltZTwvdWljb250cm9sPiB0YWIsDQotYnJvd3NlIHRvIHRoZSBsb2NhdGlvbiB3aGVyZSB5b3UgaW5zdGFsbGVkIEFwYWNoZSBBeGlzMi4gQSBtZXNzYWdlIHdpbGwgZGlzcGxheQ0KLWlmIHRoZSBydW50aW1lIGlzIGluc3RhbGxlZCBzdWNjZXNzZnVsbHkuPC9saT4NCi08L29sPjwvcD48L3NlY3Rpb24+DQotPHNlY3Rpb24+PHRpdGxlPkNyZWF0aW5nIHByb2plY3RzIGZvciBBeGlzMiBXZWIgc2VydmljZXM8L3RpdGxlPjxwPlRoZSBXZWINCi1zZXJ2aWNlIHdpemFyZHMgd2lsbCBhdXRvbWF0aWNhbGx5IGFkZCB0aGUgY29ycmVjdCBmYWNldHMgdG8gYSBkeW5hbWljIFdlYg0KLXByb2plY3QuIEhvd2V2ZXIgaWYgeW91IHdhbnQgdG8gbWFudWFsbHkgY3JlYXRlIGEgZHluYW1pYyBXZWIgcHJvamVjdCBlbmFibGVkDQotZm9yIEF4aXMyIFdlYiBzZXJ2aWNlIGRldmVsb3BtZW50IGNvbXBsZXRlIHRoZSBmb2xsb3dpbmc6PG9sPg0KLTxsaT5DcmVhdGUgdGhlIHNlcnZpY2UgV2ViIHByb2plY3QgYnkgY2xpY2tpbmcgPHVpY29udHJvbD5GaWxlID4gTmV3ID4gUHJvamVjdA0KLT4gRHluYW1pYyBXZWIgcHJvamVjdDwvdWljb250cm9sPi4gRW50ZXIgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbjogPG9sPg0KLTxsaT5Qcm9qZWN0IE5hbWU6IFR5cGUgYSBwcm9qZWN0IG5hbWU8L2xpPg0KLTxsaT5JZiB5b3UgYXJlIGRlcGxveWluZyB0byBhIFRvbWNhdCBzZXJ2ZXIsIGVuc3VyZSB0aGF0IDx1aWNvbnRyb2w+QWRkIHByb2plY3QNCi10byBhbiBFQVI8L3VpY29udHJvbD4gaXMgbm90IHNlbGVjdGVkLiBJZiB5b3UgZG8gbm90IGNsZWFyIHRoaXMgY2hlY2tib3ggeW91DQotd2lsbCBiZSB1bmFibGUgdG8gc2VsZWN0IHRoZSBUb21jYXQgc2VydmVyLiBJZiB5b3UgYXJlIGRlcGxveWluZyB0byA8dG0gdG1jbGFzcz0iaWJtIg0KLXRtb3duZXI9IklCTSBDb3Jwb3JhdGlvbiIgdG10eXBlPSJyZWciIHRyYWRlbWFyaz0iV2ViU3BoZXJlIj5XZWJTcGhlcmU8L3RtPiBBcHBsaWNhdGlvbg0KLXNlcnZlciB5b3Ugd2lsbCBuZWVkIHRvIGFkZCB0aGUgcHJvamVjdCB0byBhbiBFQVIuPC9saT4NCi08bGk+VGFyZ2V0IHJ1bnRpbWU6IFNlbGVjdCB0aGUgdmVyc2lvbiBvZiB0aGUgc2VydmVyIHRvIHdoaWNoIHlvdSB3aWxsIGRlcGxveQ0KLXlvdXIgV2ViIHNlcnZpY2UuIElmIGl0IGlzIG5vdCBsaXN0ZWQsIGNsaWNrIDx1aWNvbnRyb2w+TmV3PC91aWNvbnRyb2w+IGFuZA0KLWJyb3dzZSB0byB0aGUgbG9jYXRpb24gd2hlcmUgaXQgaXMgaW5zdGFsbGVkLjwvbGk+DQotPGxpPkNvbmZpZ3VyYXRpb25zOiBTZWxlY3QgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmb3IgeW91ciBzZXJ2ZXIgdHlwZS48L2xpPg0KLTxsaT5DbGljayA8dWljb250cm9sPkZpbmlzaDwvdWljb250cm9sPi48L2xpPg0KLTwvb2w+PC9saT4NCi08bGk+QWRkIHRoZSBBeGlzMiBmYWNldC4gUmlnaHQtY2xpY2sgeW91ciBwcm9qZWN0IGFuZCBjbGljayA8bWVudWNhc2NhZGU+DQotPHVpY29udHJvbD5Qcm9wZXJ0aWVzPC91aWNvbnRyb2w+PHVpY29udHJvbD5Qcm9qZWN0IEZhY2V0czwvdWljb250cm9sPjx1aWNvbnRyb2w+TW9kaWZ5DQotcHJvamVjdDwvdWljb250cm9sPjx1aWNvbnRyb2w+QXhpczIgV2ViIFNlcnZpY2VzPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4sDQotYW5kIGNsaWNrIDx1aWNvbnRyb2w+RmluaXNoPC91aWNvbnRyb2w+LjwvbGk+DQotPGxpPklmIHlvdSBoYXZlIGNob3NlbiB0byBkZXBsb3kgdG8gYSBzZXJ2ZXIgaW4gd2hpY2ggdGhlIEF4aXMyIEpBUiBmaWxlcw0KLXdpbGwgcmVzaWRlIG9uIHRoZSBzZXJ2ZXIgKHN1Y2ggYXMgV2ViU3BoZXJlIEFwcGxpY2F0aW9uIFNlcnZlciksIHlvdSBtdXN0DQotY2hhbmdlIHRoZSBjbGFzc2xvYWRpbmcgZm9yIHRoZSBFQVIgZnJvbSBQQVJFTlRfRklSU1QgdG8gUEFSRU5UX0xBU1QuIEV4cGFuZA0KLXRoZSBFQVIgYXNzb2NpYXRlZCB3aXRoIHlvdXIgQXhpczIgcHJvamVjdCwgYW5kIGxhdW5jaCBpdHMgZGVwbG95bWVudCBkZXNjcmlwdG9yLg0KLU9uIHRoZSA8dWljb250cm9sPkRlcGxveW1lbnQ8L3VpY29udHJvbD4gdGFiLCBleHBhbmQgdGhlIDx1aWNvbnRyb2w+QXBwbGljYXRpb248L3VpY29udHJvbD4gc2VjdGlvbi4NCi1DaGFuZ2UgdGhlIDx1aWNvbnRyb2w+Q2xhc3Nsb2FkZXIgbW9kZTwvdWljb250cm9sPiBmaWVsZCB0byBQQVJFTlRfTEFTVCBhbmQNCi1zYXZlIHlvdXIgY2hhbmdlcy48L2xpPg0KLTwvb2w+PC9wPjwvc2VjdGlvbj4NCi08L2NvbmJvZHk+DQotPHJlbGF0ZWQtbGlua3M+DQotPGxpbmtsaXN0Pjx0aXRsZT5SZWxhdGVkIENvbmNlcHRzPC90aXRsZT4NCi08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Qud3MuZG9jLnVzZXIvY29uY2VwdHMvY3dzLmRpdGEiIHNjb3BlPSJwZWVyIj4NCi08bGlua3RleHQ+V2ViIHNlcnZpY2VzPC9saW5rdGV4dD48L2xpbms+DQotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LndzLmRvYy51c2VyL2NvbmNlcHRzL2N3c2lud3NhLmRpdGEiIHNjb3BlPSJwZWVyIj4NCi08bGlua3RleHQ+VG9vbHMgZm9yIFdlYiBzZXJ2aWNlcyBkZXZlbG9wbWVudDwvbGlua3RleHQ+PC9saW5rPg0KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC53cy5kb2MudXNlci9jb25jZXB0cy9jamF4cnBjLmRpdGEiIHNjb3BlPSJwZWVyIj4NCi08bGlua3RleHQ+SkFYLVJQQzwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua2xpc3Q+DQotPGxpbmtsaXN0Pjx0aXRsZT5SZWxhdGVkIFRhc2tzPC90aXRsZT4NCi08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Qud3MuZG9jLnVzZXIvdGFza3MvdG92ZXJ3cy5kaXRhIiBzY29wZT0icGVlciI+DQotPGxpbmt0ZXh0PiBEZXZlbG9waW5nIFdlYiBzZXJ2aWNlczwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua2xpc3Q+DQotPC9yZWxhdGVkLWxpbmtzPg0KLTwvY29uY2VwdD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS5kb2MudXNlci90b3BpY3MvY2F4aXMydG92ZXIuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyL3RvcGljcy9jYXhpczJ0b3Zlci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjM2NTY0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyL3RvcGljcy9jYXhpczJ0b3Zlci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJjb25jZXB0IiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNyZWF0aW5nIFdlYiBzZXJ2aWNlcyB3aXRoIHRoZSBBcGFjaGUgQXhpczIgcnVudGltZSBlbnZpcm9ubWVudHMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhpcyBydW50aW1lIGVudmlyb25tZW50IGlzIGZvciB1c2VycyB3aG8gcHJlZmVyIHRvIGRldmVsb3AgZm9yIHRoZSBvcGVuIEFwYWNoZSBBeGlzIHBsYXRmb3JtLiBCb3RoIEF4aXMxIGFuZCBBeGlzMiBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBXZWIgc2VydmljZXMgdG9vbHMuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlRoaXMgcnVudGltZSBlbnZpcm9ubWVudCBpcyBmb3IgdXNlcnMgd2hvIHByZWZlciB0byBkZXZlbG9wIGZvciB0aGUgb3BlbiBBcGFjaGUgQXhpcyBwbGF0Zm9ybS4gQm90aCBBeGlzMSBhbmQgQXhpczIgYXJlIHN1cHBvcnRlZCBieSB0aGUgV2ViIHNlcnZpY2VzIHRvb2xzLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IkF4aXMgcnVudGltZSBlbnZpcm9ubWVudCwgV2ViIHNlcnZpY2VzLCBvdmVydmlldyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IkF4aXMgcnVudGltZSBlbnZpcm9ubWVudCwgV2ViIHNlcnZpY2VzLCBvdmVydmlldyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YXhpczJidS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGF4aXMydGQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RheGlzMmNsaWVudC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Qud3MuZG9jLnVzZXIvY29uY2VwdHMvY3dzLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC53cy5kb2MudXNlci9jb25jZXB0cy9jd3NpbndzYS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Qud3MuZG9jLnVzZXIvY29uY2VwdHMvY2pheHJwYy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Qud3MuZG9jLnVzZXIvdGFza3MvdG92ZXJ3cy5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImF4aXNvdmVydmlldyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkNyZWF0aW5nIFdlYiBzZXJ2aWNlcyB3aXRoIHRoZSBBcGFjaGUgQXhpczIgcnVudGltZSBlbnZpcm9ubWVudHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImF4aXNvdmVydmlldyI+PGEgbmFtZT0iYXhpc292ZXJ2aWV3Ij48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DcmVhdGluZyBXZWIgc2VydmljZXMgd2l0aCB0aGUgQXBhY2hlIEF4aXMyIHJ1bnRpbWUgZW52aXJvbm1lbnRzPC9oMT4KLQotCi0KLTxkaXY+PHA+VGhpcyBydW50aW1lIGVudmlyb25tZW50IGlzIGZvciB1c2VycyB3aG8gcHJlZmVyIHRvIGRldmVsb3AgZm9yCi10aGUgb3BlbiBBcGFjaGUgQXhpcyBwbGF0Zm9ybS4gQm90aCBBeGlzMSBhbmQgQXhpczIgYXJlIHN1cHBvcnRlZCBieSB0aGUgV2ViCi1zZXJ2aWNlcyB0b29scy48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5BcGFjaGUgQXhpczIgT3ZlcnZpZXc8L2g0PjxwPkF4aXMyIGV2b2x2ZWQgZnJvbSB0aGUgQXBhY2hlCi1BeGlzMS54IGFyY2hpdGVjdHVyZSBhbmQgaXMgbW9yZSBmbGV4aWJsZSwgY29uZmlndXJhYmxlLCBhbmQgZWZmaWNpZW50LCB3aGlsZQotcmV0YWluaW5nIHRoZSBwb3NpdGl2ZSBhc3BlY3RzIG9mIEFwYWNoZSBBeGlzMS54IGFyY2hpdGVjdHVyZS48L3A+Ci08ZGl2IGNsYXNzPSJwIj5UaGUgV2ViCi1zZXJ2aWNlIHRvb2xzIHByb3ZpZGVkIHdpdGggdGhpcyBwcm9kdWN0IHN1cHBvcnQgdGhlIGZvbGxvd2luZyBzcGVjaWZpY2F0aW9ucwotd2hlbiBjcmVhdGluZyBBcGFjaGUgQXhpczIgV2ViIHNlcnZpY2VzIGFuZCBjbGllbnRzOjx1bD4KLTxsaT5TT0FQIDEuMSBhbmQgMS4yPC9saT4KLQotPGxpPldTREwgMS4xLCBpbmNsdWRpbmcgYm90aCBTT0FQIGFuZCBIVFRQIGJpbmRpbmdzIDwvbGk+Ci0KLTxsaT5IVFRQIHRyYW5zcG9ydHM8L2xpPgotCi08L3VsPgotVGhlIGxldmVscyBvZiBBeGlzMiBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IHRoZSB0b29scyBpcyAxLjIgYW5kIDEuMy4KLUF4aXMyIGNhbiBiZSBkZXBsb3llZCB0byBhbnkgc2VydmVyIHRoYXQgc3VwcG9ydHMgSmF2YeKEoiBTZXJ2bGV0IDIuMiBzcGVjaWZpY2F0aW9uIG9yIGhpZ2hlciwKLWluY2x1ZGluZyBJQk08c3VwPsKuPC9zdXA+IFdlYlNwaGVyZTxzdXA+wq48L3N1cD4gQXBwbGljYXRpb24KLVNlcnZlciA2LjEsIGFuZCBBcGFjaGUgVG9tY2F0IHNlcnZlci4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gQXhpczIsIHJlZmVyCi10byA8YSBocmVmPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi8iIHRhcmdldD0iX2JsYW5rIj5odHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMjwvYT4uIDwvZGl2PgotPHA+VGhlCi1zdXBwb3J0IGZvciBBcGFjaGUgQXhpczIgaXMgbGltaXRlZCB0byB2YWxpZGF0aW9uIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGlzCi1pbnZva2luZyB0aGUgQXhpczIgZW1pdHRlcnMgY29ycmVjdGx5LiBTdXBwb3J0IGZvciBvdGhlciBBeGlzMiBpc3N1ZXMgc2hvdWxkCi1iZSBkaXJlY3RlZCB0byA8YSBocmVmPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi8iIHRhcmdldD0iX2JsYW5rIj5odHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMjwvYT48L3A+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPkluc3RhbGxpbmcgdGhlIEFwYWNoZSBBeGlzMiBydW50aW1lPC9oND48ZGl2IGNsYXNzPSJwIj5Vbmxpa2UgY3JlYXRpbmcKLVdlYiBzZXJ2aWNlcyBpbiB0aGUgQXBhY2hlIEF4aXMxLnggcnVudGltZSwgYmVmb3JlIGNyZWF0aW5nIGEgV2ViIHNlcnZpY2UKLXVzaW5nIEFwYWNoZSBBeGlzMiB5b3UgbXVzdCBkb3dubG9hZCB0aGUgQXhpczIgcnVudGltZSBhbmQgaW5zdGFsbCBpdCB0aGUKLXdvcmtiZW5jaCB1c2luZyB0aGUgV2ViIHNlcnZpY2VzIEF4aXMyIHByZWZlcmVuY2VzIHBhZ2UuPG9sPgotPGxpPkRvd25sb2FkIEFwYWNoZSBBeGlzMiB2MS4yIG9yIHYxLjMgZnJvbSB0aGUgZm9sbG93aW5nIHNpdGU6IDxhIGhyZWY9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL2Rvd25sb2FkLmNnaSIgdGFyZ2V0PSJfYmxhbmsiPmh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL2Rvd25sb2FkLmNnaTwvYT4uPC9saT4KLQotPGxpPkZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zIGluIHRoZSBhcHByb3ByaWF0ZSBBcGFjaGUgQXhpczIgaW5zdGFsbGF0aW9uIGd1aWRlOiA8dWw+Ci08bGk+QXBhY2hlIEF4aXMyIHYxLjI8YSBocmVmPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi8xXzIvaW5zdGFsbGF0aW9uZ3VpZGUuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPmh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyLzFfMi9pbnN0YWxsYXRpb25ndWlkZS5odG1sPC9hPjwvbGk+Ci0KLTxsaT5BcGFjaGUgQXhpczIgdjEuMzxhIGhyZWY9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyLzFfMy9pbnN0YWxsYXRpb25ndWlkZS5odG1sIiB0YXJnZXQ9Il9ibGFuayI+aHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvMV8zL2luc3RhbGxhdGlvbmd1aWRlLmh0bWw8L2E+PC9saT4KLQotPC91bD4KLTwvbGk+Ci0KLTxsaT5PbmNlIHRoZSBBcGFjaGUgQXhpczIgcnVudGltZSBpcyBpbnN0YWxsZWQsIHlvdSBuZWVkIHRvIGFzc29jaWF0ZSBpdCB3aXRoCi10aGUgd29ya2JlbmNoLiBJbiB0aGUgd29ya2JlbmNoLCBvcGVuIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93PC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJlZmVyZW5jZXM8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2ViIHNlcnZpY2VzPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkF4aXMyCi1QcmVmZXJlbmNlczwvc3Bhbj48L3NwYW4+LiBPbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QXhpczIgUnVudGltZTwvc3Bhbj4gdGFiLAotYnJvd3NlIHRvIHRoZSBsb2NhdGlvbiB3aGVyZSB5b3UgaW5zdGFsbGVkIEFwYWNoZSBBeGlzMi4gQSBtZXNzYWdlIHdpbGwgZGlzcGxheQotaWYgdGhlIHJ1bnRpbWUgaXMgaW5zdGFsbGVkIHN1Y2Nlc3NmdWxseS48L2xpPgotCi08L29sPgotPC9kaXY+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPkNyZWF0aW5nIHByb2plY3RzIGZvciBBeGlzMiBXZWIgc2VydmljZXM8L2g0PjxkaXYgY2xhc3M9InAiPlRoZSBXZWIKLXNlcnZpY2Ugd2l6YXJkcyB3aWxsIGF1dG9tYXRpY2FsbHkgYWRkIHRoZSBjb3JyZWN0IGZhY2V0cyB0byBhIGR5bmFtaWMgV2ViCi1wcm9qZWN0LiBIb3dldmVyIGlmIHlvdSB3YW50IHRvIG1hbnVhbGx5IGNyZWF0ZSBhIGR5bmFtaWMgV2ViIHByb2plY3QgZW5hYmxlZAotZm9yIEF4aXMyIFdlYiBzZXJ2aWNlIGRldmVsb3BtZW50IGNvbXBsZXRlIHRoZSBmb2xsb3dpbmc6PG9sPgotPGxpPkNyZWF0ZSB0aGUgc2VydmljZSBXZWIgcHJvamVjdCBieSBjbGlja2luZyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaWxlICZndDsgTmV3ICZndDsgUHJvamVjdAotJmd0OyBEeW5hbWljIFdlYiBwcm9qZWN0PC9zcGFuPi4gRW50ZXIgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbjogPG9sIHR5cGU9ImEiPgotPGxpPlByb2plY3QgTmFtZTogVHlwZSBhIHByb2plY3QgbmFtZTwvbGk+Ci0KLTxsaT5JZiB5b3UgYXJlIGRlcGxveWluZyB0byBhIFRvbWNhdCBzZXJ2ZXIsIGVuc3VyZSB0aGF0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBwcm9qZWN0Ci10byBhbiBFQVI8L3NwYW4+IGlzIG5vdCBzZWxlY3RlZC4gSWYgeW91IGRvIG5vdCBjbGVhciB0aGlzIGNoZWNrYm94IHlvdQotd2lsbCBiZSB1bmFibGUgdG8gc2VsZWN0IHRoZSBUb21jYXQgc2VydmVyLiBJZiB5b3UgYXJlIGRlcGxveWluZyB0byBXZWJTcGhlcmUgQXBwbGljYXRpb24KLXNlcnZlciB5b3Ugd2lsbCBuZWVkIHRvIGFkZCB0aGUgcHJvamVjdCB0byBhbiBFQVIuPC9saT4KLQotPGxpPlRhcmdldCBydW50aW1lOiBTZWxlY3QgdGhlIHZlcnNpb24gb2YgdGhlIHNlcnZlciB0byB3aGljaCB5b3Ugd2lsbCBkZXBsb3kKLXlvdXIgV2ViIHNlcnZpY2UuIElmIGl0IGlzIG5vdCBsaXN0ZWQsIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5ldzwvc3Bhbj4gYW5kCi1icm93c2UgdG8gdGhlIGxvY2F0aW9uIHdoZXJlIGl0IGlzIGluc3RhbGxlZC48L2xpPgotCi08bGk+Q29uZmlndXJhdGlvbnM6IFNlbGVjdCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZvciB5b3VyIHNlcnZlciB0eXBlLjwvbGk+Ci0KLTxsaT5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaW5pc2g8L3NwYW4+LjwvbGk+Ci0KLTwvb2w+Ci08L2xpPgotCi08bGk+QWRkIHRoZSBBeGlzMiBmYWNldC4gUmlnaHQtY2xpY2sgeW91ciBwcm9qZWN0IGFuZCBjbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPgotPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJvcGVydGllczwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Qcm9qZWN0IEZhY2V0czwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Nb2RpZnkKLXByb2plY3Q8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QXhpczIgV2ViIFNlcnZpY2VzPC9zcGFuPjwvc3Bhbj4sCi1hbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmluaXNoPC9zcGFuPi48L2xpPgotCi08bGk+SWYgeW91IGhhdmUgY2hvc2VuIHRvIGRlcGxveSB0byBhIHNlcnZlciBpbiB3aGljaCB0aGUgQXhpczIgSkFSIGZpbGVzCi13aWxsIHJlc2lkZSBvbiB0aGUgc2VydmVyIChzdWNoIGFzIFdlYlNwaGVyZSBBcHBsaWNhdGlvbiBTZXJ2ZXIpLCB5b3UgbXVzdAotY2hhbmdlIHRoZSBjbGFzc2xvYWRpbmcgZm9yIHRoZSBFQVIgZnJvbSBQQVJFTlRfRklSU1QgdG8gUEFSRU5UX0xBU1QuIEV4cGFuZAotdGhlIEVBUiBhc3NvY2lhdGVkIHdpdGggeW91ciBBeGlzMiBwcm9qZWN0LCBhbmQgbGF1bmNoIGl0cyBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi1PbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RGVwbG95bWVudDwvc3Bhbj4gdGFiLCBleHBhbmQgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFwcGxpY2F0aW9uPC9zcGFuPiBzZWN0aW9uLgotQ2hhbmdlIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5DbGFzc2xvYWRlciBtb2RlPC9zcGFuPiBmaWVsZCB0byBQQVJFTlRfTEFTVCBhbmQKLXNhdmUgeW91ciBjaGFuZ2VzLjwvbGk+Ci0KLTwvb2w+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj4KLTx1bCBjbGFzcz0idWxsaW5rcyI+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9Ii4uL3RvcGljcy90YXhpczJidS5odG1sIj5DcmVhdGluZyBhIFdlYiBzZXJ2aWNlIGZyb20gYSBKYXZhIGJlYW4gdXNpbmcgdGhlIEFwYWNoZSBBeGlzMiBydW50aW1lIGVudmlyb25tZW50PC9hPjwvc3Ryb25nPjxiciAvPgotVGhlIFdlYiBTZXJ2aWNlIHdpemFyZCBhc3Npc3RzIHlvdSBpbiBjcmVhdGluZyBhIG5ldyBXZWIgc2VydmljZSwgY29uZmlndXJpbmcgaXQgZm9yIGRlcGxveW1lbnQsIGFuZCBkZXBsb3lpbmcgdGhlIFdlYiBzZXJ2aWNlIHRvIGEgc2VydmVyLiBPbmNlIHlvdXIgV2ViIHNlcnZpY2UgaXMgZGVwbG95ZWQsIHRoZSB3aXphcmQgYXNzaXN0cyB5b3UgaW4gZ2VuZXJhdGluZyB0aGUgY2xpZW50IHByb3h5IGFuZCBzYW1wbGUgYXBwbGljYXRpb24gdG8gdGVzdCB0aGUgV2ViIHNlcnZpY2UuIFdoZW4geW91IGhhdmUgY29tcGxldGVkIHRlc3RpbmcsIHlvdSBjYW4gcHVibGlzaCB5b3VyIFdlYiBzZXJ2aWNlIHRvIGEgVURESSBCdXNpbmVzcyBSZWdpc3RyeSB1c2luZyB0aGUgRXhwb3J0IHdpemFyZC48L2xpPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSIuLi90b3BpY3MvdGF4aXMydGQuaHRtbCI+Q3JlYXRpbmcgYSBKYXZhIGJlYW4gc2tlbGV0b24gZnJvbSBhIFdTREwgZG9jdW1lbnQgdXNpbmcgdGhlIEFwYWNoZSBBeGlzMiBydW50aW1lIGVudmlyb25tZW50PC9hPjwvc3Ryb25nPjxiciAvPgotVGhlIFdlYiBzZXJ2aWNlIHdpemFyZCBhc3Npc3RzIHlvdSBpbiBjcmVhdGluZyBhIHNrZWxldG9uIGJlYW4gZnJvbSBhbiBleGlzdGluZyBXU0RMIGRvY3VtZW50LiBUaGUgc2tlbGV0b24gYmVhbiBjb250YWlucyBhIHNldCBvZiBtZXRob2RzIHRoYXQgY29ycmVzcG9uZCB0byB0aGUgb3BlcmF0aW9ucyBkZXNjcmliZWQgaW4gdGhlIFdTREwgZG9jdW1lbnQuIFdoZW4gdGhlIGJlYW4gaXMgY3JlYXRlZCwgZWFjaCBtZXRob2QgaGFzIGEgdHJpdmlhbCBpbXBsZW1lbnRhdGlvbiB0aGF0IHlvdSByZXBsYWNlIGJ5IGVkaXRpbmcgdGhlIGJlYW4uPC9saT4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0iLi4vdG9waWNzL3RheGlzMmNsaWVudC5odG1sIj5HZW5lcmF0aW5nIGEgSmF2YSBjbGllbnQgcHJveHkgYW5kIGEgc2FtcGxlIGFwcGxpY2F0aW9uIGZyb20gYSBXU0RMIGRvY3VtZW50IHVzaW5nIHRoZSBBeGlzMiBydW50aW1lIGVudmlyb25tZW50PC9hPjwvc3Ryb25nPjxiciAvPgotVGhlIFdlYiBTZXJ2aWNlIENsaWVudCB3aXphcmQgYXNzaXN0cyB5b3UgaW4gZ2VuZXJhdGluZyBhIEphdmEgYmVhbiBwcm94eSBhbmQgYSBzYW1wbGUgYXBwbGljYXRpb24uIFRoZSBzYW1wbGUgV2ViIGFwcGxpY2F0aW9uIGRlbW9uc3RyYXRlcyBob3cgdG8gY29kZSBhIHByb3h5IGZpbGUuPC9saT4KLTwvdWw+Ci0KLTxkaXYgY2xhc3M9ImxpbmtsaXN0Ij48c3Ryb25nPlJlbGF0ZWQgQ29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLQotPGRpdj48YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Qud3MuZG9jLnVzZXIvY29uY2VwdHMvY3dzLmh0bWwiPldlYiBzZXJ2aWNlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LndzLmRvYy51c2VyL2NvbmNlcHRzL2N3c2lud3NhLmh0bWwiPlRvb2xzIGZvciBXZWIgc2VydmljZXMgZGV2ZWxvcG1lbnQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC53cy5kb2MudXNlci9jb25jZXB0cy9jamF4cnBjLmh0bWwiPkpBWC1SUEM8L2E+PC9kaXY+PC9kaXY+Ci0KLTxkaXYgY2xhc3M9ImxpbmtsaXN0Ij48c3Ryb25nPlJlbGF0ZWQgVGFza3M8L3N0cm9uZz48YnIgLz4KLQotPGRpdj48YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Qud3MuZG9jLnVzZXIvdGFza3MvdG92ZXJ3cy5odG1sIj4gRGV2ZWxvcGluZyBXZWIgc2VydmljZXM8L2E+PC9kaXY+PC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyL3RvcGljcy90YXhpczJidS5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvdG9waWNzL3RheGlzMmJ1LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmYTMzZDcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvdG9waWNzL3RheGlzMmJ1LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAiLi4vLi4vZHRkL3Rhc2suZHRkIj4NCi08dGFzayBpZD0idHdzYmVhbmEiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkNyZWF0aW5nIGEgV2ViIHNlcnZpY2UgZnJvbSBhIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IGJlYW4gdXNpbmcgdGhlIEFwYWNoZSBBeGlzMiBydW50aW1lDQotZW52aXJvbm1lbnQ8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkNyZWF0aW5nIGEgV2ViIHNlcnZpY2UgZnJvbSBhIEphdmEgYmVhbiB1c2luZyB0aGUgQXBhY2hlIEF4aXMyDQotcnVudGltZSBlbnZpcm9ubWVudDwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5UaGUgV2ViIFNlcnZpY2Ugd2l6YXJkIGFzc2lzdHMgeW91IGluIGNyZWF0aW5nIGEgbmV3IFdlYiBzZXJ2aWNlLA0KLWNvbmZpZ3VyaW5nIGl0IGZvciBkZXBsb3ltZW50LCBhbmQgZGVwbG95aW5nIHRoZSBXZWIgc2VydmljZSB0byBhIHNlcnZlci4NCi1PbmNlIHlvdXIgV2ViIHNlcnZpY2UgaXMgZGVwbG95ZWQsIHRoZSB3aXphcmQgYXNzaXN0cyB5b3UgaW4gZ2VuZXJhdGluZyB0aGUNCi1jbGllbnQgcHJveHkgYW5kIHNhbXBsZSBhcHBsaWNhdGlvbiB0byB0ZXN0IHRoZSBXZWIgc2VydmljZS4gV2hlbiB5b3UgaGF2ZQ0KLWNvbXBsZXRlZCB0ZXN0aW5nLCB5b3UgY2FuIHB1Ymxpc2ggeW91ciBXZWIgc2VydmljZSB0byBhIFVEREkgQnVzaW5lc3MgUmVnaXN0cnkNCi11c2luZyB0aGUgRXhwb3J0IHdpemFyZC48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5BeGlzMiBydW50aW1lIGVudmlyb25tZW50PGluZGV4dGVybT5XZWIgc2VydmljZXM8aW5kZXh0ZXJtPkphdmENCi1iZWFuczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+V2ViIHNlcnZpY2VzPGluZGV4dGVybT5BeGlzMg0KLXJ1bnRpbWUgZW52aXJvbm1lbnQ8aW5kZXh0ZXJtPmNyZWF0aW5nIGEgV2ViIHNlcnZpY2U8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxwcmVyZXE+PHA+UHJlcmVxdWlzaXRlczo8b2w+DQotPGxpIGlkPSJpbnN0YWxsYXhpczJsaW5rIj5Zb3UgbXVzdCBoYXZlIGluc3RhbGxlZCB0aGUgQXBhY2hlIEF4aXMyIHJ1bnRpbWUNCi1lbnZpcm9ubWVudCBhcyBkZXNjcmliZWQgaW46IDx4cmVmIGhyZWY9ImNheGlzMnRvdmVyLmRpdGEiIHNjb3BlPSJsb2NhbCI+PC94cmVmPjwvbGk+DQotPGxpIGlkPSJjcmVhdGV0b21jYXRsaW5rIj5JZiB5b3UgYXJlIHVzaW5nIHRoZSBBcGFjaGUgSmFrYXJ0YSBUb21jYXQgc2VydmxldA0KLWNvbnRhaW5lciBhcyB5b3VyIHNlcnZlciwgeW91IG11c3QgaW5zdGFsbCBpdCwgY29uZmlndXJlIGFuIGluc3RhbmNlIG9mIGl0LA0KLWFuZCBjcmVhdGUgYSBXZWIgcHJvamVjdCB0YXJnZXRlZCB0byBpdCBhcyBkZXNjcmliZWQgaW46IDx4cmVmIGhyZWY9Ii4uL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLnVpLmRvYy51c2VyL3RvcGljcy90dG9tY2F0c2Vydi5kaXRhIg0KLXNjb3BlPSJwZWVyIj5DcmVhdGluZyBhbiBBcGFjaGUgVG9tY2F0IHNlcnZlciBhbmQgV2ViIHByb2plY3Q8L3hyZWY+PC9saT4NCi08bGk+Q3JlYXRlIG9yIGltcG9ydCBhIGJlYW4gaW50byB0aGUgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gc291cmNlIGZvbGRlciBvZiB0aGUgV2ViIHByb2plY3QuIFRvDQotaW1wb3J0LCBzZWxlY3QgdGhlIDxiPjx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IFJlc291cmNlczogc3JjPC9iPiBmb2xkZXIsIGFuZCBmcm9tDQotdGhlIGZpbGUgbWVudSBzZWxlY3QgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+SW1wb3J0PC91aWNvbnRyb2w+PHVpY29udHJvbD5HZW5lcmFsPC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5GaWxlIFN5c3RlbTwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+IGFuZCBicm93c2UgdG8gd2hlcmUgeW91cg0KLXBhY2thZ2UgaXMuPC9saT4NCi08L29sPjwvcD48L3ByZXJlcT4NCi08Y29udGV4dD5UbyBjcmVhdGUgYSBXZWIgc2VydmljZSBmcm9tIGEgYmVhbiB1c2luZyB0aGUgQXBhY2hlIEF4aXMyIHJ1bnRpbWUNCi1lbnZpcm9ubWVudDo8L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+U3dpdGNoIHRvIHRoZSBKMkVFIHBlcnNwZWN0aXZlICg8dWljb250cm9sPldpbmRvdyA+IE9wZW4gUGVyc3BlY3RpdmUNCi0+IEoyRUU8L3VpY29udHJvbD4pLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHZpZXcsIHNlbGVjdCB0aGUgYmVhbiB0aGF0IHlvdSBjcmVhdGVkDQotb3IgaW1wb3J0ZWQgaW50byB0aGUgc291cmNlIGZvbGRlciBvZiB5b3VyIFdlYiBwcm9qZWN0LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrICA8dWljb250cm9sPkZpbGUgPiBOZXcgPiBPdGhlcjwvdWljb250cm9sPi48L2NtZD48aW5mbz5TZWxlY3Q8dWljb250cm9sPldlYg0KLVNlcnZpY2VzPC91aWNvbnRyb2w+IGluIG9yZGVyIHRvIGRpc3BsYXkgdGhlIHZhcmlvdXMgV2ViIHNlcnZpY2Ugd2l6YXJkcy4NCi1TZWxlY3QgdGhlICA8dWljb250cm9sPldlYiBTZXJ2aWNlPC91aWNvbnRyb2w+IHdpemFyZC4gQ2xpY2sgIDx1aWNvbnRyb2w+TmV4dDwvdWljb250cm9sPi48L2luZm8+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+V2ViIFNlcnZpY2VzIHBhZ2U6IHNlbGVjdCAgPHVpY29udHJvbD5Cb3R0b20gdXAgSmF2YSBiZWFuIFdlYiBzZXJ2aWNlPC91aWNvbnRyb2w+IGFzDQoteW91ciBXZWIgc2VydmljZSB0eXBlLCBhbmQgc2VsZWN0IHRoZSA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBiZWFuIGZyb20gd2hpY2ggdGhlIHNlcnZpY2Ugd2lsbCBiZQ0KLWNyZWF0ZWQuPC9jbWQ+DQotPHN1YnN0ZXBzIGlkPSJjcmVhdGVzdGVwNHVsIj4NCi08c3Vic3RlcD48Y21kPlNlbGVjdCB0aGUgc3RhZ2VzIG9mIFdlYiBzZXJ2aWNlcyBkZXZlbG9wbWVudCB0aGF0IHlvdSB3YW50DQotdG8gY29tcGxldGUgdXNpbmcgdGhlIHNsaWRlcjo8L2NtZD48aW5mbz48dWw+DQotPGxpPkRldmVsb3A6IHRoaXMgd2lsbCBkZXZlbG9wIHRoZSBXU0RMIGRlZmluaXRpb24gYW5kIGltcGxlbWVudGF0aW9uIG9mIHRoZQ0KLVdlYiBzZXJ2aWNlLiBUaGlzIGluY2x1ZGVzIHN1Y2ggdGFza3MgYXMgY3JlYXRpbmcgdGhlIG1vZHVsZXMgd2hpY2ggd2lsbCBjb250YWluDQotdGhlIGdlbmVyYXRlZCBjb2RlLCBXU0RMIGZpbGVzLCBkZXBsb3ltZW50IGRlc2NyaXB0b3JzLCBhbmQgPHRtIHRtY2xhc3M9InNwZWNpYWwiDQotdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gZmlsZXMNCi13aGVuIGFwcHJvcHJpYXRlLjwvbGk+DQotPGxpPkFzc2VtYmxlOiB0aGlzIGVuc3VyZXMgdGhlIHByb2plY3QgdGhhdCB3aWxsIGhvc3QgdGhlIFdlYiBzZXJ2aWNlIG9yIGNsaWVudA0KLWdldHMgYXNzb2NpYXRlZCB0byBhbiBFQVIgd2hlbiByZXF1aXJlZCBieSB0aGUgdGFyZ2V0IGFwcGxpY2F0aW9uIHNlcnZlci48L2xpPg0KLTxsaT5EZXBsb3k6IHRoaXMgd2lsbCBjcmVhdGUgdGhlIGRlcGxveW1lbnQgY29kZSBmb3IgdGhlIHNlcnZpY2UuPC9saT4NCi08bGk+SW5zdGFsbDogdGhpcyB3aWxsIGluc3RhbGwgYW5kIGNvbmZpZ3VyZSB0aGUgV2ViIG1vZHVsZSBhbmQgRUFScyBvbiB0aGUNCi10YXJnZXQgc2VydmVyLjwvbGk+DQotPGxpPlN0YXJ0OiB0aGlzIHdpbGwgc3RhcnQgdGhlIHNlcnZlciBvbmNlIHRoZSBzZXJ2aWNlIGhhcyBiZWVuIGluc3RhbGxlZA0KLW9uIGl0LiBUaGUgc2VydmVyLWNvbmZpZy53c2RkIGZpbGUgd2lsbCBiZSBnZW5lcmF0ZWQuPC9saT4NCi08bGk+VGVzdDogdGhpcyB3aWxsIHByb3ZpZGUgdmFyaW91cyBvcHRpb25zIGZvciB0ZXN0aW5nIHRoZSBzZXJ2aWNlLCBzdWNoDQotYXMgdXNpbmcgdGhlIFdlYiBTZXJ2aWNlIEV4cGxvcmVyIG9yIHNhbXBsZSBKU1BzLjwvbGk+DQotPC91bD48L2luZm8+PC9zdWJzdGVwPg0KLTxzdWJzdGVwPjxjbWQ+U2VsZWN0IHlvdXIgc2VydmVyOiB0aGUgZGVmYXVsdCBzZXJ2ZXIgaXMgZGlzcGxheWVkLiBJZiB5b3UNCi13YW50IHRvIGRlcGxveSB5b3VyIHNlcnZpY2UgdG8gYSBkaWZmZXJlbnQgc2VydmVyIGNsaWNrIHRoZSBsaW5rIHRvIHNwZWNpZnkNCi1hIGRpZmZlcmVudCBzZXJ2ZXIuPC9jbWQ+PC9zdWJzdGVwPg0KLTxzdWJzdGVwPjxjbWQ+U2VsZWN0IHlvdXIgcnVudGltZTogZW5zdXJlIHRoZSBBcGFjaGUgQXhpczIgcnVudGltZSBpcyBzZWxlY3RlZC48L2NtZD4NCi08L3N1YnN0ZXA+DQotPHN1YnN0ZXA+PGNtZD5TZWxlY3QgdGhlIHNlcnZpY2UgcHJvamVjdDogdGhlIHByb2plY3Qgc2VsZWN0ZWQgaW4geW91ciB3b3Jrc3BhY2UNCi1pcyBkaXNwbGF5ZWQuIFRvIHNlbGVjdCBhIGRpZmZlcmVudCBwcm9qZWN0IGNsaWNrIG9uIHRoZSBwcm9qZWN0IGxpbmsuIElmDQoteW91IGFyZSBkZXBsb3lpbmcgdG8gPHRtIHRtY2xhc3M9ImlibSIgdG1vd25lcj0iSUJNIENvcnBvcmF0aW9uIiB0bXR5cGU9InJlZyINCi10cmFkZW1hcms9IldlYlNwaGVyZSI+V2ViU3BoZXJlPC90bT4gQXBwbGljYXRpb24gU2VydmVyIHlvdSB3aWxsIGFsc28gYmUgYXNrZWQNCi10byBzZWxlY3QgdGhlIEVBUiBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2plY3QuPC9jbWQ+PGluZm8+RW5zdXJlIHRoYXQgdGhlDQotcHJvamVjdCBzZWxlY3RlZCBhcyB0aGUgQ2xpZW50IFdlYiBQcm9qZWN0IGlzIGRpZmZlcmVudCBmcm9tIHRoZSBTZXJ2aWNlIFdlYg0KLVByb2plY3QsIG9yIHRoZSBzZXJ2aWNlIHdpbGwgYmUgb3ZlcndyaXR0ZW4gYnkgdGhlIGNsaWVudCdzIGdlbmVyYXRlZCBhcnRpZmFjdHMuPC9pbmZvPg0KLTwvc3Vic3RlcD4NCi08c3Vic3RlcD48Y21kPklmIHlvdSB3YW50IHRvIGNyZWF0ZSBhIGNsaWVudCwgc2VsZWN0IHRoZSB0eXBlIG9mIHByb3h5IHRvDQotYmUgZ2VuZXJhdGVkIGFuZCByZXBlYXQgdGhlIGFib3ZlIHN0ZXBzIGZvciB0aGUgY2xpZW50LjwvY21kPjwvc3Vic3RlcD4NCi08c3Vic3RlcD48Y21kPlB1Ymxpc2ggdGhlIFdlYiBzZXJ2aWNlOiB0aGlzIHdpbGwgbGF1bmNoIHRoZSBXZWIgU2VydmljZXMgRXhwbG9yZXINCi10byBwdWJsaXNoIHlvdXIgV2ViIHNlcnZpY2UgdG8gYSBVRERJIHJlZ2lzdHJ5LjwvY21kPjwvc3Vic3RlcD4NCi08c3Vic3RlcD48Y21kPk1vbml0b3IgdGhlIFdlYiBzZXJ2aWNlOiB0aGlzIHdpbGwgc2VuZCB0aGUgV2ViIHNlcnZpY2UgdHJhZmZpYw0KLXRocm91Z2ggdGhlIFRDUC9JUCBNb25pdG9yLCB3aGljaCBhbGxvd3MgeW91IHRvIHdhdGNoIHRoZSBTT0FQIHRyYWZmaWMgZ2VuZXJhdGVkDQotYnkgdGhlIFdlYiBzZXJ2aWNlIGFuZCB0byB0ZXN0IHRoaXMgdHJhZmZpYyBmb3IgV1MtSSBjb21wbGlhbmNlLiBBbHRlcm5hdGVseQ0KLXlvdSBjYW4gbWFudWFsbHkgc2V0IHVwIGEgVENQL0lQIG1vbml0b3IgYXMgZGVzY3JpYmVkIGluIDx4cmVmIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC53c2kudWkuZG9jLnVzZXIvdGFza3MvdG1vbml0b3IuZGl0YSINCi1zY29wZT0icGVlciI+VXNpbmcgdGhlIFRDUC9JUCBNb25pdG9yIHRvIHRlc3QgV2ViIHNlcnZpY2VzPC94cmVmPjwvY21kPjwvc3Vic3RlcD4NCi08L3N1YnN0ZXBzPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkF4aXMyIFdlYiBTZXJ2aWNlIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IEJlYW4gQ29uZmlndXJhdGlvbiBwYWdlOiBJZiB5b3UgaGF2ZQ0KLWEgY3VzdG9tIHNlcnZpY2VzLnhtbCBmaWxlIHlvdSBjYW4gcG9pbnQgdG8gaXQgb24gdGhpcyBwYWdlLCBvciB5b3UgY2FuIGhhdmUNCi10aGUgd2l6YXJkIGNyZWF0ZSBhIGRlZmF1bHQgc2VydmljZXMueG1sIGZpbGUgZm9yIHlvdS48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5XZWIgU2VydmljZSBUZXN0IHBhZ2U6IElmIHlvdSBzZWxlY3RlZCB0byB0ZXN0IHRoZSBXZWIgc2VydmljZSwNCi1zZWxlY3QgdGhlIHRlc3QgZmFjaWxpdHkgZm9yIHRoZSBnZW5lcmF0ZWQgV2ViIHNlcnZpY2UuPC9jbWQ+PGluZm8+VGhpcyB3aWxsDQotb3BlbiB0aGUgV2ViIHNlcnZpY2UgaW4gdGhlIFdlYiBTZXJ2aWNlcyBFeHBsb3Jlci4gU2VsZWN0IHRoZSBvcGVyYXRpb24geW91DQotd2FudCB0byB0ZXN0LCBlbnRlciB0aGUgcmVxdWlyZWQgaW5mb3JtYXRpb24sIGFuZCBjbGljazx1aWNvbnRyb2w+R288L3VpY29udHJvbD4uDQotVGhlIHJlc3VsdCB3aWxsIGRpc3BsYXkgaW4gdGhlIFN0YXR1cyBwYW5lLiBDbGljayAgPHVpY29udHJvbD5OZXh0PC91aWNvbnRyb2w+LjwvaW5mbz4NCi08L3N0ZXA+DQotPHN0ZXAgaWQ9ImF4aXMyY2xpZW50cGFnZWxpbmsiPjxjbWQ+QXhpczIgQ2xpZW50IFdlYiBzZXJ2aWNlIGNvbmZpZ3VyYXRpb24NCi1wYWdlOiBVc2UgdGhpcyBwYWdlIHRvIHNlbGVjdCB0aGUgZm9sbG93aW5nIG9wdGlvbnM6IDwvY21kPg0KLTxzdWJzdGVwcz4NCi08c3Vic3RlcD48Y21kPlNlcnZpY2UgTmFtZTogYWNjZXB0IHRoZSBkZWZhdWx0LjwvY21kPjwvc3Vic3RlcD4NCi08c3Vic3RlcD48Y21kPlBvcnQgTmFtZTogYWNjZXB0IHRoZSBkZWZhdWx0LjwvY21kPjwvc3Vic3RlcD4NCi08c3Vic3RlcD48Y21kPkRhdGFiaW5kaW5nIE5hbWU6IG9ubHkgdGhlIEF4aXMyIERhdGFiaW5kaW5nIEZyYW1ld29yayAoQURCKQ0KLWlzIHN1cHBvcnRlZCBhdCB0aGlzIHRpbWUuPC9jbWQ+PC9zdWJzdGVwPg0KLTxzdWJzdGVwPjxjbWQ+Q3VzdG9tIHBhY2thZ2UgbmFtZTogWW91IGNhbiBjaGFuZ2UgdGhlIHBhY2thZ2UgbmFtZSBpbiB0aGlzDQotZmllbGQuPC9jbWQ+PC9zdWJzdGVwPg0KLTxzdWJzdGVwPjxjbWQ+Q2xpZW50IG1vZGU6IFlvdSBjYW4gY2hvb3NlIGlmIHRoZSBjbGllbnQgaXMgc3luY2hyb25vdXMsIGFzeW5jaHJvbm91cywNCi1vciBib3RoLjwvY21kPjwvc3Vic3RlcD4NCi08c3Vic3RlcD48Y21kPkdlbmVyYXRlIHRlc3QgY2FzZSB0byB0ZXN0IHRoZSBzZXJ2aWNlOiBJZiB5b3Ugc2VsZWN0IHRoaXMsDQotdGhlIEF4aXMyIGVtaXR0ZXIgd2lsbCBnZW5lcmF0ZSBKVW5pdCB0ZXN0Y2FzZXMgbWF0Y2hpbmcgdGhlIFdTREwgcHJvdmlkZWQNCi10byB0aGUgY2xpZW50LiBUaGVzZSBKVW5pdCB0ZXN0Y2FzZXMgd2lsbCBiZSBnZW5lcmF0ZWQgdG8gYSBuZXdseSBhZGRlZCBzb3VyY2UNCi1kaXJlY3RvcnkgdG8gdGhlIGNsaWVudCBwcm9qZWN0IGNhbGxlZCA8dWljb250cm9sPnRlc3Q8L3VpY29udHJvbD4uIDwvY21kPg0KLTwvc3Vic3RlcD4NCi08c3Vic3RlcD48Y21kPkdlbmVyYXRlIGFsbCB0eXBlcyBmb3IgYWxsIGVsZW1lbnRzIHJlZmVycmVkIGJ5IHNjaGVtYXM8L2NtZD4NCi08L3N1YnN0ZXA+DQotPHN1YnN0ZXA+PGNtZD5OYW1lc3BhY2UgdG8gcGFja2FnZSBtYXBwaW5nOiBVc2UgdGhpcyB0YWJsZSB0byByZXZpZXcgb3IgZWRpdA0KLXRoZSBtYXBwaW5ncyBiZXR3ZWVuIHBhY2thZ2VzIGFuZCBuYW1lc3BhY2VzLjwvY21kPjwvc3Vic3RlcD4NCi08L3N1YnN0ZXBzPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPldlYiBTZXJ2aWNlIENsaWVudCBUZXN0IHBhZ2U6IFVzZSB0aGlzIHBhZ2UgdG8gc2VsZWN0IHRoZSBmb2xsb3dpbmcNCi1vcHRpb25zOiA8L2NtZD4NCi08c3Vic3RlcHM+DQotPHN1YnN0ZXA+PGNtZD5TZWxlY3QgeW91ciB0ZXN0IGZhY2lsaXR5LiBZb3UgY2FuIHRlc3QgdGhlIGdlbmVyYXRlZCBwcm94eQ0KLWluIHRoZSBXZWIgU2VydmljZSBFeHBsb3Jlciwgb3IgdGhlIFVuaXZlcnNhbCBUZXN0IENsaWVudC48L2NtZD48L3N1YnN0ZXA+DQotPHN1YnN0ZXA+PGNtZD5TZWxlY3QgIDx1aWNvbnRyb2w+UnVuIHRlc3Qgb24gc2VydmVyPC91aWNvbnRyb2w+IHRvIHN0YXJ0IHRoZQ0KLXNlcnZlciBmb3IgeW91IGF1dG9tYXRpY2FsbHkuPC9jbWQ+PC9zdWJzdGVwPg0KLTwvc3Vic3RlcHM+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+V2ViIFNlcnZpY2UgUHVibGljYXRpb24gcGFnZTogU2VsZWN0IHdoZXRoZXIgb3Igbm90IHlvdSB3YW50IHRvDQotcHVibGlzaCB0aGlzIFdlYiBzZXJ2aWNlIHRvIGEgVURESSByZWdpc3RyeS4gQ2xpY2sgPHVpY29udHJvbD5GaW5pc2g8L3VpY29udHJvbD4uPC9jbWQ+DQotPC9zdGVwPg0KLTwvc3RlcHM+DQotPHJlc3VsdCBpZD0iYXhpc3dzY3JlYXRlcmVzdWx0Ij48cD5BZnRlciB0aGUgV2ViIHNlcnZpY2UgaGFzIGJlZW4gY3JlYXRlZCwNCi10aGUgZm9sbG93aW5nIG1heSBvY2N1ciBkZXBlbmRpbmcgb24gdGhlIG9wdGlvbnMgeW91IHNlbGVjdGVkOiA8dWw+DQotPGxpPklmIHlvdSBoYXZlIHNlbGVjdGVkIHRvIHRlc3QgdGhlIFdlYiBzZXJ2aWNlIHVzaW5nIHRoZSBXZWIgU2VydmljZXMgRXhwbG9yZXIsDQotdGhlIEV4cGxvcmVyIHdpbGwgb3Blbi4gU2VsZWN0IHRoZSBvcGVyYXRpb24geW91IHdhbnQgdG8gdGVzdCwgZW50ZXIgdGhlIHJlcXVpcmVkDQotaW5mb3JtYXRpb24sIGFuZCBjbGljayAgPGI+R288L2I+LiBUaGUgcmVzdWx0IHdpbGwgZGlzcGxheSBpbiB0aGUgU3RhdHVzIHBhbmUuPC9saT4NCi08bGk+SWYgeW91IGhhdmUgc2VsZWN0ZWQgdG8gcHVibGlzaCB0aGUgV2ViIHNlcnZpY2UsIHRoZSBXZWIgU2VydmljZXMgRXhwbG9yZXINCi1pcyBsYXVuY2hlZCBkaXNwbGF5aW5nIHRoZSBwYWdlIHJlcXVpcmVkIHRvIHB1Ymxpc2ggeW91ciBXZWIgc2VydmljZS4gRm9sbG93DQotdGhlIGluc3RydWN0aW9ucyBpbiAgPHZhcm5hbWU+UHVibGlzaGluZyB0aGUgV2ViIHNlcnZpY2U8L3Zhcm5hbWU+IHRvIGNvbXBsZXRlDQotdGhpcyB0YXNrLjwvbGk+DQotPC91bD48L3A+PC9yZXN1bHQ+DQotPHBvc3RyZXE+PHA+IDx1aWNvbnRyb2w+SW1wb3J0YW50OjwvdWljb250cm9sPiBJZiB5b3VyIG1ldGhvZHMgY29udGFpbiB0eXBlcywNCi1ub3Qgc3VwcG9ydGVkIGJ5IHRoZSBzYW1wbGUsIHN1Y2ggYXMgYXJyYXlzLCBpbmRleGVkIHByb3BlcnRpZXMsIGFuZCBjb2xsZWN0aW9ucywNCi10aGUgbWV0aG9kcyB3aWxsIGJlIG9taXR0ZWQgZnJvbSB0aGUgc2FtcGxlIGFuZCB5b3Ugd2lsbCByZWNlaXZlIGEgd2FybmluZw0KLW1lc3NhZ2UuPC9wPjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTxyZWxhdGVkLWxpbmtzPg0KLTxsaW5rbGlzdD48dGl0bGU+UmVsYXRlZCBDb25jZXB0czwvdGl0bGU+DQotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LndzLmRvYy51c2VyL2NvbmNlcHRzL2N3c2lud3NhLmRpdGEiIHNjb3BlPSJwZWVyIj4NCi08bGlua3RleHQ+IFRvb2xzIGZvciBXZWIgc2VydmljZXMgZGV2ZWxvcG1lbnQ8L2xpbmt0ZXh0PjwvbGluaz4NCi08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Qud3MuZG9jLnVzZXIvY29uY2VwdHMvY3dzLmRpdGEiIHNjb3BlPSJwZWVyIj4NCi08bGlua3RleHQ+V2ViIHNlcnZpY2VzIGRldmVsb3BtZW50PC9saW5rdGV4dD48L2xpbms+DQotPC9saW5rbGlzdD4NCi08bGlua2xpc3Q+PHRpdGxlPlJlbGF0ZWQgVGFza3M8L3RpdGxlPg0KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC53cy5kb2MudXNlci90YXNrcy90b3ZlcndzLmRpdGEiIHNjb3BlPSJwZWVyIj4NCi08bGlua3RleHQ+IERldmVsb3BpbmcgV2ViIHNlcnZpY2VzPC9saW5rdGV4dD48L2xpbms+DQotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLmRvYy51c2VyL3Rhc2tzL3R1ZGRpZXhwLmRpdGEiDQotc2NvcGU9InBlZXIiPjxsaW5rdGV4dD4gVXNpbmcgdGhlIFdlYiBTZXJ2aWNlcyBFeHBsb3JlcjwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua2xpc3Q+DQotPC9yZWxhdGVkLWxpbmtzPg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS5kb2MudXNlci90b3BpY3MvdGF4aXMyYnUuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyL3RvcGljcy90YXhpczJidS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjk4ZDhlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyL3RvcGljcy90YXhpczJidS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNyZWF0aW5nIGEgV2ViIHNlcnZpY2UgZnJvbSBhIEphdmEgYmVhbiB1c2luZyB0aGUgQXBhY2hlIEF4aXMyIHJ1bnRpbWUgZW52aXJvbm1lbnQiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhlIFdlYiBTZXJ2aWNlIHdpemFyZCBhc3Npc3RzIHlvdSBpbiBjcmVhdGluZyBhIG5ldyBXZWIgc2VydmljZSwgY29uZmlndXJpbmcgaXQgZm9yIGRlcGxveW1lbnQsIGFuZCBkZXBsb3lpbmcgdGhlIFdlYiBzZXJ2aWNlIHRvIGEgc2VydmVyLiBPbmNlIHlvdXIgV2ViIHNlcnZpY2UgaXMgZGVwbG95ZWQsIHRoZSB3aXphcmQgYXNzaXN0cyB5b3UgaW4gZ2VuZXJhdGluZyB0aGUgY2xpZW50IHByb3h5IGFuZCBzYW1wbGUgYXBwbGljYXRpb24gdG8gdGVzdCB0aGUgV2ViIHNlcnZpY2UuIFdoZW4geW91IGhhdmUgY29tcGxldGVkIHRlc3RpbmcsIHlvdSBjYW4gcHVibGlzaCB5b3VyIFdlYiBzZXJ2aWNlIHRvIGEgVURESSBCdXNpbmVzcyBSZWdpc3RyeSB1c2luZyB0aGUgRXhwb3J0IHdpemFyZC4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhlIFdlYiBTZXJ2aWNlIHdpemFyZCBhc3Npc3RzIHlvdSBpbiBjcmVhdGluZyBhIG5ldyBXZWIgc2VydmljZSwgY29uZmlndXJpbmcgaXQgZm9yIGRlcGxveW1lbnQsIGFuZCBkZXBsb3lpbmcgdGhlIFdlYiBzZXJ2aWNlIHRvIGEgc2VydmVyLiBPbmNlIHlvdXIgV2ViIHNlcnZpY2UgaXMgZGVwbG95ZWQsIHRoZSB3aXphcmQgYXNzaXN0cyB5b3UgaW4gZ2VuZXJhdGluZyB0aGUgY2xpZW50IHByb3h5IGFuZCBzYW1wbGUgYXBwbGljYXRpb24gdG8gdGVzdCB0aGUgV2ViIHNlcnZpY2UuIFdoZW4geW91IGhhdmUgY29tcGxldGVkIHRlc3RpbmcsIHlvdSBjYW4gcHVibGlzaCB5b3VyIFdlYiBzZXJ2aWNlIHRvIGEgVURESSBCdXNpbmVzcyBSZWdpc3RyeSB1c2luZyB0aGUgRXhwb3J0IHdpemFyZC4iIC8+Ci08bWV0YSBjb250ZW50PSJBeGlzMiBydW50aW1lIGVudmlyb25tZW50LCBXZWIgc2VydmljZXMsIEphdmEgYmVhbnMsIEF4aXMyIHJ1bnRpbWUgZW52aXJvbm1lbnQsIGNyZWF0aW5nIGEgV2ViIHNlcnZpY2UiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJBeGlzMiBydW50aW1lIGVudmlyb25tZW50LCBXZWIgc2VydmljZXMsIEphdmEgYmVhbnMsIEF4aXMyIHJ1bnRpbWUgZW52aXJvbm1lbnQsIGNyZWF0aW5nIGEgV2ViIHNlcnZpY2UiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY2F4aXMydG92ZXIuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LndzLmRvYy51c2VyL2NvbmNlcHRzL2N3c2lud3NhLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC53cy5kb2MudXNlci9jb25jZXB0cy9jd3MuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LndzLmRvYy51c2VyL3Rhc2tzL3RvdmVyd3MuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLmRvYy51c2VyL3Rhc2tzL3R1ZGRpZXhwLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHdzYmVhbmEiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5DcmVhdGluZyBhIFdlYiBzZXJ2aWNlIGZyb20gYSBKYXZhIGJlYW4gdXNpbmcgdGhlIEFwYWNoZSBBeGlzMgotcnVudGltZSBlbnZpcm9ubWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHdzYmVhbmEiPjxhIG5hbWU9InR3c2JlYW5hIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DcmVhdGluZyBhIFdlYiBzZXJ2aWNlIGZyb20gYSBKYXZhIGJlYW4gdXNpbmcgdGhlIEFwYWNoZSBBeGlzMiBydW50aW1lCi1lbnZpcm9ubWVudDwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+VGhlIFdlYiBTZXJ2aWNlIHdpemFyZCBhc3Npc3RzIHlvdSBpbiBjcmVhdGluZyBhIG5ldyBXZWIgc2VydmljZSwKLWNvbmZpZ3VyaW5nIGl0IGZvciBkZXBsb3ltZW50LCBhbmQgZGVwbG95aW5nIHRoZSBXZWIgc2VydmljZSB0byBhIHNlcnZlci4KLU9uY2UgeW91ciBXZWIgc2VydmljZSBpcyBkZXBsb3llZCwgdGhlIHdpemFyZCBhc3Npc3RzIHlvdSBpbiBnZW5lcmF0aW5nIHRoZQotY2xpZW50IHByb3h5IGFuZCBzYW1wbGUgYXBwbGljYXRpb24gdG8gdGVzdCB0aGUgV2ViIHNlcnZpY2UuIFdoZW4geW91IGhhdmUKLWNvbXBsZXRlZCB0ZXN0aW5nLCB5b3UgY2FuIHB1Ymxpc2ggeW91ciBXZWIgc2VydmljZSB0byBhIFVEREkgQnVzaW5lc3MgUmVnaXN0cnkKLXVzaW5nIHRoZSBFeHBvcnQgd2l6YXJkLjwvcD4KLQotPGRpdiBjbGFzcz0icCI+PGRpdiBjbGFzcz0icCI+UHJlcmVxdWlzaXRlczo8b2w+Ci08bGkgaWQ9InR3c2JlYW5hX19pbnN0YWxsYXhpczJsaW5rIj48YSBuYW1lPSJ0d3NiZWFuYV9faW5zdGFsbGF4aXMybGluayI+PCEtLSAtLT48L2E+WW91IG11c3QgaGF2ZSBpbnN0YWxsZWQgdGhlIEFwYWNoZSBBeGlzMiBydW50aW1lCi1lbnZpcm9ubWVudCBhcyBkZXNjcmliZWQgaW46IDxhIGhyZWY9ImNheGlzMnRvdmVyLmh0bWwiIHRpdGxlPSJUaGlzIHJ1bnRpbWUgZW52aXJvbm1lbnQgaXMgZm9yIHVzZXJzIHdobyBwcmVmZXIgdG8gZGV2ZWxvcCBmb3ImIzEwO3RoZSBvcGVuIEFwYWNoZSBBeGlzIHBsYXRmb3JtLiBCb3RoIEF4aXMxIGFuZCBBeGlzMiBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBXZWImIzEwO3NlcnZpY2VzIHRvb2xzLiI+Q3JlYXRpbmcgV2ViIHNlcnZpY2VzIHdpdGggdGhlIEFwYWNoZSBBeGlzMiBydW50aW1lIGVudmlyb25tZW50czwvYT48L2xpPgotCi08bGkgaWQ9InR3c2JlYW5hX19jcmVhdGV0b21jYXRsaW5rIj48YSBuYW1lPSJ0d3NiZWFuYV9fY3JlYXRldG9tY2F0bGluayI+PCEtLSAtLT48L2E+SWYgeW91IGFyZSB1c2luZyB0aGUgQXBhY2hlIEpha2FydGEgVG9tY2F0IHNlcnZsZXQKLWNvbnRhaW5lciBhcyB5b3VyIHNlcnZlciwgeW91IG11c3QgaW5zdGFsbCBpdCwgY29uZmlndXJlIGFuIGluc3RhbmNlIG9mIGl0LAotYW5kIGNyZWF0ZSBhIFdlYiBwcm9qZWN0IHRhcmdldGVkIHRvIGl0IGFzIGRlc2NyaWJlZCBpbjogPGEgaHJlZj0iLi4vb3JnLmVjbGlwc2UuanN0LndzLmF4aXMudWkuZG9jLnVzZXIvdG9waWNzL3R0b21jYXRzZXJ2Lmh0bWwiPkNyZWF0aW5nIGFuIEFwYWNoZSBUb21jYXQgc2VydmVyIGFuZCBXZWIgcHJvamVjdDwvYT48L2xpPgotCi08bGk+Q3JlYXRlIG9yIGltcG9ydCBhIGJlYW4gaW50byB0aGUgSmF2YeKEoiBzb3VyY2UgZm9sZGVyIG9mIHRoZSBXZWIgcHJvamVjdC4gVG8KLWltcG9ydCwgc2VsZWN0IHRoZSA8c3Ryb25nPkphdmEgUmVzb3VyY2VzOiBzcmM8L3N0cm9uZz4gZm9sZGVyLCBhbmQgZnJvbQotdGhlIGZpbGUgbWVudSBzZWxlY3QgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5JbXBvcnQ8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+R2VuZXJhbDwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbGUgU3lzdGVtPC9zcGFuPjwvc3Bhbj4gYW5kIGJyb3dzZSB0byB3aGVyZSB5b3VyCi1wYWNrYWdlIGlzLjwvbGk+Ci0KLTwvb2w+Ci08L2Rpdj4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UbyBjcmVhdGUgYSBXZWIgc2VydmljZSBmcm9tIGEgYmVhbiB1c2luZyB0aGUgQXBhY2hlIEF4aXMyIHJ1bnRpbWUKLWVudmlyb25tZW50OjwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlN3aXRjaCB0byB0aGUgSjJFRSBwZXJzcGVjdGl2ZSAoPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93ICZndDsgT3BlbiBQZXJzcGVjdGl2ZQotJmd0OyBKMkVFPC9zcGFuPikuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldywgc2VsZWN0IHRoZSBiZWFuIHRoYXQgeW91IGNyZWF0ZWQKLW9yIGltcG9ydGVkIGludG8gdGhlIHNvdXJjZSBmb2xkZXIgb2YgeW91ciBXZWIgcHJvamVjdC48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayAgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmlsZSAmZ3Q7IE5ldyAmZ3Q7IE90aGVyPC9zcGFuPi48L3NwYW4+IFNlbGVjdDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldlYgotU2VydmljZXM8L3NwYW4+IGluIG9yZGVyIHRvIGRpc3BsYXkgdGhlIHZhcmlvdXMgV2ViIHNlcnZpY2Ugd2l6YXJkcy4KLVNlbGVjdCB0aGUgIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldlYiBTZXJ2aWNlPC9zcGFuPiB3aXphcmQuIENsaWNrICA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXh0PC9zcGFuPi4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+V2ViIFNlcnZpY2VzIHBhZ2U6IHNlbGVjdCAgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Qm90dG9tIHVwIEphdmEgYmVhbiBXZWIgc2VydmljZTwvc3Bhbj4gYXMKLXlvdXIgV2ViIHNlcnZpY2UgdHlwZSwgYW5kIHNlbGVjdCB0aGUgSmF2YSBiZWFuIGZyb20gd2hpY2ggdGhlIHNlcnZpY2Ugd2lsbCBiZQotY3JlYXRlZC48L3NwYW4+Ci08YSBuYW1lPSJ0d3NiZWFuYV9fY3JlYXRlc3RlcDR1bCI+PCEtLSAtLT48L2E+PG9sIHR5cGU9ImEiIGlkPSJ0d3NiZWFuYV9fY3JlYXRlc3RlcDR1bCI+Ci08bGkgY2xhc3M9InN1YnN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCB0aGUgc3RhZ2VzIG9mIFdlYiBzZXJ2aWNlcyBkZXZlbG9wbWVudCB0aGF0IHlvdSB3YW50Ci10byBjb21wbGV0ZSB1c2luZyB0aGUgc2xpZGVyOjwvc3Bhbj4gPHVsPgotPGxpPkRldmVsb3A6IHRoaXMgd2lsbCBkZXZlbG9wIHRoZSBXU0RMIGRlZmluaXRpb24gYW5kIGltcGxlbWVudGF0aW9uIG9mIHRoZQotV2ViIHNlcnZpY2UuIFRoaXMgaW5jbHVkZXMgc3VjaCB0YXNrcyBhcyBjcmVhdGluZyB0aGUgbW9kdWxlcyB3aGljaCB3aWxsIGNvbnRhaW4KLXRoZSBnZW5lcmF0ZWQgY29kZSwgV1NETCBmaWxlcywgZGVwbG95bWVudCBkZXNjcmlwdG9ycywgYW5kIEphdmEgZmlsZXMKLXdoZW4gYXBwcm9wcmlhdGUuPC9saT4KLQotPGxpPkFzc2VtYmxlOiB0aGlzIGVuc3VyZXMgdGhlIHByb2plY3QgdGhhdCB3aWxsIGhvc3QgdGhlIFdlYiBzZXJ2aWNlIG9yIGNsaWVudAotZ2V0cyBhc3NvY2lhdGVkIHRvIGFuIEVBUiB3aGVuIHJlcXVpcmVkIGJ5IHRoZSB0YXJnZXQgYXBwbGljYXRpb24gc2VydmVyLjwvbGk+Ci0KLTxsaT5EZXBsb3k6IHRoaXMgd2lsbCBjcmVhdGUgdGhlIGRlcGxveW1lbnQgY29kZSBmb3IgdGhlIHNlcnZpY2UuPC9saT4KLQotPGxpPkluc3RhbGw6IHRoaXMgd2lsbCBpbnN0YWxsIGFuZCBjb25maWd1cmUgdGhlIFdlYiBtb2R1bGUgYW5kIEVBUnMgb24gdGhlCi10YXJnZXQgc2VydmVyLjwvbGk+Ci0KLTxsaT5TdGFydDogdGhpcyB3aWxsIHN0YXJ0IHRoZSBzZXJ2ZXIgb25jZSB0aGUgc2VydmljZSBoYXMgYmVlbiBpbnN0YWxsZWQKLW9uIGl0LiBUaGUgc2VydmVyLWNvbmZpZy53c2RkIGZpbGUgd2lsbCBiZSBnZW5lcmF0ZWQuPC9saT4KLQotPGxpPlRlc3Q6IHRoaXMgd2lsbCBwcm92aWRlIHZhcmlvdXMgb3B0aW9ucyBmb3IgdGVzdGluZyB0aGUgc2VydmljZSwgc3VjaAotYXMgdXNpbmcgdGhlIFdlYiBTZXJ2aWNlIEV4cGxvcmVyIG9yIHNhbXBsZSBKU1BzLjwvbGk+Ci0KLTwvdWw+Ci08L2xpPgotCi08bGkgY2xhc3M9InN1YnN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCB5b3VyIHNlcnZlcjogdGhlIGRlZmF1bHQgc2VydmVyIGlzIGRpc3BsYXllZC4gSWYgeW91Ci13YW50IHRvIGRlcGxveSB5b3VyIHNlcnZpY2UgdG8gYSBkaWZmZXJlbnQgc2VydmVyIGNsaWNrIHRoZSBsaW5rIHRvIHNwZWNpZnkKLWEgZGlmZmVyZW50IHNlcnZlci48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdWJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgeW91ciBydW50aW1lOiBlbnN1cmUgdGhlIEFwYWNoZSBBeGlzMiBydW50aW1lIGlzIHNlbGVjdGVkLjwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3Vic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IHRoZSBzZXJ2aWNlIHByb2plY3Q6IHRoZSBwcm9qZWN0IHNlbGVjdGVkIGluIHlvdXIgd29ya3NwYWNlCi1pcyBkaXNwbGF5ZWQuIFRvIHNlbGVjdCBhIGRpZmZlcmVudCBwcm9qZWN0IGNsaWNrIG9uIHRoZSBwcm9qZWN0IGxpbmsuIElmCi15b3UgYXJlIGRlcGxveWluZyB0byBXZWJTcGhlcmU8c3VwPsKuPC9zdXA+IEFwcGxpY2F0aW9uIFNlcnZlciB5b3Ugd2lsbCBhbHNvIGJlIGFza2VkCi10byBzZWxlY3QgdGhlIEVBUiBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2plY3QuPC9zcGFuPiBFbnN1cmUgdGhhdCB0aGUKLXByb2plY3Qgc2VsZWN0ZWQgYXMgdGhlIENsaWVudCBXZWIgUHJvamVjdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgU2VydmljZSBXZWIKLVByb2plY3QsIG9yIHRoZSBzZXJ2aWNlIHdpbGwgYmUgb3ZlcndyaXR0ZW4gYnkgdGhlIGNsaWVudCdzIGdlbmVyYXRlZCBhcnRpZmFjdHMuCi08L2xpPgotCi08bGkgY2xhc3M9InN1YnN0ZXBleHBhbmQiPjxzcGFuPklmIHlvdSB3YW50IHRvIGNyZWF0ZSBhIGNsaWVudCwgc2VsZWN0IHRoZSB0eXBlIG9mIHByb3h5IHRvCi1iZSBnZW5lcmF0ZWQgYW5kIHJlcGVhdCB0aGUgYWJvdmUgc3RlcHMgZm9yIHRoZSBjbGllbnQuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3Vic3RlcGV4cGFuZCI+PHNwYW4+UHVibGlzaCB0aGUgV2ViIHNlcnZpY2U6IHRoaXMgd2lsbCBsYXVuY2ggdGhlIFdlYiBTZXJ2aWNlcyBFeHBsb3JlcgotdG8gcHVibGlzaCB5b3VyIFdlYiBzZXJ2aWNlIHRvIGEgVURESSByZWdpc3RyeS48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdWJzdGVwZXhwYW5kIj48c3Bhbj5Nb25pdG9yIHRoZSBXZWIgc2VydmljZTogdGhpcyB3aWxsIHNlbmQgdGhlIFdlYiBzZXJ2aWNlIHRyYWZmaWMKLXRocm91Z2ggdGhlIFRDUC9JUCBNb25pdG9yLCB3aGljaCBhbGxvd3MgeW91IHRvIHdhdGNoIHRoZSBTT0FQIHRyYWZmaWMgZ2VuZXJhdGVkCi1ieSB0aGUgV2ViIHNlcnZpY2UgYW5kIHRvIHRlc3QgdGhpcyB0cmFmZmljIGZvciBXUy1JIGNvbXBsaWFuY2UuIEFsdGVybmF0ZWx5Ci15b3UgY2FuIG1hbnVhbGx5IHNldCB1cCBhIFRDUC9JUCBtb25pdG9yIGFzIGRlc2NyaWJlZCBpbiA8YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3Qud3NpLnVpLmRvYy51c2VyL3Rhc2tzL3Rtb25pdG9yLmh0bWwiPlVzaW5nIHRoZSBUQ1AvSVAgTW9uaXRvciB0byB0ZXN0IFdlYiBzZXJ2aWNlczwvYT48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5BeGlzMiBXZWIgU2VydmljZSBKYXZhIEJlYW4gQ29uZmlndXJhdGlvbiBwYWdlOiBJZiB5b3UgaGF2ZQotYSBjdXN0b20gc2VydmljZXMueG1sIGZpbGUgeW91IGNhbiBwb2ludCB0byBpdCBvbiB0aGlzIHBhZ2UsIG9yIHlvdSBjYW4gaGF2ZQotdGhlIHdpemFyZCBjcmVhdGUgYSBkZWZhdWx0IHNlcnZpY2VzLnhtbCBmaWxlIGZvciB5b3UuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+V2ViIFNlcnZpY2UgVGVzdCBwYWdlOiBJZiB5b3Ugc2VsZWN0ZWQgdG8gdGVzdCB0aGUgV2ViIHNlcnZpY2UsCi1zZWxlY3QgdGhlIHRlc3QgZmFjaWxpdHkgZm9yIHRoZSBnZW5lcmF0ZWQgV2ViIHNlcnZpY2UuPC9zcGFuPiBUaGlzIHdpbGwKLW9wZW4gdGhlIFdlYiBzZXJ2aWNlIGluIHRoZSBXZWIgU2VydmljZXMgRXhwbG9yZXIuIFNlbGVjdCB0aGUgb3BlcmF0aW9uIHlvdQotd2FudCB0byB0ZXN0LCBlbnRlciB0aGUgcmVxdWlyZWQgaW5mb3JtYXRpb24sIGFuZCBjbGljazxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkdvPC9zcGFuPi4KLVRoZSByZXN1bHQgd2lsbCBkaXNwbGF5IGluIHRoZSBTdGF0dXMgcGFuZS4gQ2xpY2sgIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5leHQ8L3NwYW4+LgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIiBpZD0idHdzYmVhbmFfX2F4aXMyY2xpZW50cGFnZWxpbmsiPjxhIG5hbWU9InR3c2JlYW5hX19heGlzMmNsaWVudHBhZ2VsaW5rIj48IS0tIC0tPjwvYT48c3Bhbj5BeGlzMiBDbGllbnQgV2ViIHNlcnZpY2UgY29uZmlndXJhdGlvbgotcGFnZTogVXNlIHRoaXMgcGFnZSB0byBzZWxlY3QgdGhlIGZvbGxvd2luZyBvcHRpb25zOiA8L3NwYW4+Ci08b2wgdHlwZT0iYSI+Ci08bGk+PHNwYW4+U2VydmljZSBOYW1lOiBhY2NlcHQgdGhlIGRlZmF1bHQuPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5Qb3J0IE5hbWU6IGFjY2VwdCB0aGUgZGVmYXVsdC48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkRhdGFiaW5kaW5nIE5hbWU6IG9ubHkgdGhlIEF4aXMyIERhdGFiaW5kaW5nIEZyYW1ld29yayAoQURCKQotaXMgc3VwcG9ydGVkIGF0IHRoaXMgdGltZS48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkN1c3RvbSBwYWNrYWdlIG5hbWU6IFlvdSBjYW4gY2hhbmdlIHRoZSBwYWNrYWdlIG5hbWUgaW4gdGhpcwotZmllbGQuPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5DbGllbnQgbW9kZTogWW91IGNhbiBjaG9vc2UgaWYgdGhlIGNsaWVudCBpcyBzeW5jaHJvbm91cywgYXN5bmNocm9ub3VzLAotb3IgYm90aC48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkdlbmVyYXRlIHRlc3QgY2FzZSB0byB0ZXN0IHRoZSBzZXJ2aWNlOiBJZiB5b3Ugc2VsZWN0IHRoaXMsCi10aGUgQXhpczIgZW1pdHRlciB3aWxsIGdlbmVyYXRlIEpVbml0IHRlc3RjYXNlcyBtYXRjaGluZyB0aGUgV1NETCBwcm92aWRlZAotdG8gdGhlIGNsaWVudC4gVGhlc2UgSlVuaXQgdGVzdGNhc2VzIHdpbGwgYmUgZ2VuZXJhdGVkIHRvIGEgbmV3bHkgYWRkZWQgc291cmNlCi1kaXJlY3RvcnkgdG8gdGhlIGNsaWVudCBwcm9qZWN0IGNhbGxlZCA8c3BhbiBjbGFzcz0idWljb250cm9sIj50ZXN0PC9zcGFuPi4gPC9zcGFuPgotPC9saT4KLQotPGxpPjxzcGFuPkdlbmVyYXRlIGFsbCB0eXBlcyBmb3IgYWxsIGVsZW1lbnRzIHJlZmVycmVkIGJ5IHNjaGVtYXM8L3NwYW4+Ci08L2xpPgotCi08bGk+PHNwYW4+TmFtZXNwYWNlIHRvIHBhY2thZ2UgbWFwcGluZzogVXNlIHRoaXMgdGFibGUgdG8gcmV2aWV3IG9yIGVkaXQKLXRoZSBtYXBwaW5ncyBiZXR3ZWVuIHBhY2thZ2VzIGFuZCBuYW1lc3BhY2VzLjwvc3Bhbj48L2xpPgotCi08L29sPgotCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPldlYiBTZXJ2aWNlIENsaWVudCBUZXN0IHBhZ2U6IFVzZSB0aGlzIHBhZ2UgdG8gc2VsZWN0IHRoZSBmb2xsb3dpbmcKLW9wdGlvbnM6IDwvc3Bhbj4KLTxvbCB0eXBlPSJhIj4KLTxsaT48c3Bhbj5TZWxlY3QgeW91ciB0ZXN0IGZhY2lsaXR5LiBZb3UgY2FuIHRlc3QgdGhlIGdlbmVyYXRlZCBwcm94eQotaW4gdGhlIFdlYiBTZXJ2aWNlIEV4cGxvcmVyLCBvciB0aGUgVW5pdmVyc2FsIFRlc3QgQ2xpZW50Ljwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+U2VsZWN0ICA8c3BhbiBjbGFzcz0idWljb250cm9sIj5SdW4gdGVzdCBvbiBzZXJ2ZXI8L3NwYW4+IHRvIHN0YXJ0IHRoZQotc2VydmVyIGZvciB5b3UgYXV0b21hdGljYWxseS48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5XZWIgU2VydmljZSBQdWJsaWNhdGlvbiBwYWdlOiBTZWxlY3Qgd2hldGhlciBvciBub3QgeW91IHdhbnQgdG8KLXB1Ymxpc2ggdGhpcyBXZWIgc2VydmljZSB0byBhIFVEREkgcmVnaXN0cnkuIENsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmlzaDwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiIgaWQ9InR3c2JlYW5hX19heGlzd3NjcmVhdGVyZXN1bHQiPjxhIG5hbWU9InR3c2JlYW5hX19heGlzd3NjcmVhdGVyZXN1bHQiPjwhLS0gLS0+PC9hPjxkaXYgY2xhc3M9InAiPkFmdGVyIHRoZSBXZWIgc2VydmljZSBoYXMgYmVlbiBjcmVhdGVkLAotdGhlIGZvbGxvd2luZyBtYXkgb2NjdXIgZGVwZW5kaW5nIG9uIHRoZSBvcHRpb25zIHlvdSBzZWxlY3RlZDogPHVsPgotPGxpPklmIHlvdSBoYXZlIHNlbGVjdGVkIHRvIHRlc3QgdGhlIFdlYiBzZXJ2aWNlIHVzaW5nIHRoZSBXZWIgU2VydmljZXMgRXhwbG9yZXIsCi10aGUgRXhwbG9yZXIgd2lsbCBvcGVuLiBTZWxlY3QgdGhlIG9wZXJhdGlvbiB5b3Ugd2FudCB0byB0ZXN0LCBlbnRlciB0aGUgcmVxdWlyZWQKLWluZm9ybWF0aW9uLCBhbmQgY2xpY2sgIDxzdHJvbmc+R288L3N0cm9uZz4uIFRoZSByZXN1bHQgd2lsbCBkaXNwbGF5IGluIHRoZSBTdGF0dXMgcGFuZS48L2xpPgotCi08bGk+SWYgeW91IGhhdmUgc2VsZWN0ZWQgdG8gcHVibGlzaCB0aGUgV2ViIHNlcnZpY2UsIHRoZSBXZWIgU2VydmljZXMgRXhwbG9yZXIKLWlzIGxhdW5jaGVkIGRpc3BsYXlpbmcgdGhlIHBhZ2UgcmVxdWlyZWQgdG8gcHVibGlzaCB5b3VyIFdlYiBzZXJ2aWNlLiBGb2xsb3cKLXRoZSBpbnN0cnVjdGlvbnMgaW4gIDx2YXIgY2xhc3M9InZhcm5hbWUiPlB1Ymxpc2hpbmcgdGhlIFdlYiBzZXJ2aWNlPC92YXI+IHRvIGNvbXBsZXRlCi10aGlzIHRhc2suPC9saT4KLQotPC91bD4KLTwvZGl2PgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPiA8c3BhbiBjbGFzcz0idWljb250cm9sIj5JbXBvcnRhbnQ6PC9zcGFuPiBJZiB5b3VyIG1ldGhvZHMgY29udGFpbiB0eXBlcywKLW5vdCBzdXBwb3J0ZWQgYnkgdGhlIHNhbXBsZSwgc3VjaCBhcyBhcnJheXMsIGluZGV4ZWQgcHJvcGVydGllcywgYW5kIGNvbGxlY3Rpb25zLAotdGhlIG1ldGhvZHMgd2lsbCBiZSBvbWl0dGVkIGZyb20gdGhlIHNhbXBsZSBhbmQgeW91IHdpbGwgcmVjZWl2ZSBhIHdhcm5pbmcKLW1lc3NhZ2UuPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9Ii4uL3RvcGljcy9jYXhpczJ0b3Zlci5odG1sIiB0aXRsZT0iVGhpcyBydW50aW1lIGVudmlyb25tZW50IGlzIGZvciB1c2VycyB3aG8gcHJlZmVyIHRvIGRldmVsb3AgZm9yIHRoZSBvcGVuIEFwYWNoZSBBeGlzIHBsYXRmb3JtLiBCb3RoIEF4aXMxIGFuZCBBeGlzMiBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBXZWIgc2VydmljZXMgdG9vbHMuIj5DcmVhdGluZyBXZWIgc2VydmljZXMgd2l0aCB0aGUgQXBhY2hlIEF4aXMyIHJ1bnRpbWUgZW52aXJvbm1lbnRzPC9hPjwvZGl2PgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9ImxpbmtsaXN0Ij48c3Ryb25nPlJlbGF0ZWQgQ29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLQotPGRpdj48YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Qud3MuZG9jLnVzZXIvY29uY2VwdHMvY3dzaW53c2EuaHRtbCI+IFRvb2xzIGZvciBXZWIgc2VydmljZXMgZGV2ZWxvcG1lbnQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC53cy5kb2MudXNlci9jb25jZXB0cy9jd3MuaHRtbCI+V2ViIHNlcnZpY2VzIGRldmVsb3BtZW50PC9hPjwvZGl2PjwvZGl2PgotCi08ZGl2IGNsYXNzPSJsaW5rbGlzdCI+PHN0cm9uZz5SZWxhdGVkIFRhc2tzPC9zdHJvbmc+PGJyIC8+Ci0KLTxkaXY+PGEgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LndzLmRvYy51c2VyL3Rhc2tzL3RvdmVyd3MuaHRtbCI+IERldmVsb3BpbmcgV2ViIHNlcnZpY2VzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkuZG9jLnVzZXIvdGFza3MvdHVkZGlleHAuaHRtbCI+IFVzaW5nIHRoZSBXZWIgU2VydmljZXMgRXhwbG9yZXI8L2E+PC9kaXY+PC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyL3RvcGljcy90YXhpczJjbGllbnQuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyL3RvcGljcy90YXhpczJjbGllbnQuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg4MDg0Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS5kb2MudXNlci90b3BpY3MvdGF4aXMyY2xpZW50LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTw/UHViIEluYz8+DQotPHRhc2sgaWQ9InRzYW1wYXBwYSIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+R2VuZXJhdGluZyBhIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IGNsaWVudCBwcm94eSBhbmQgYSBzYW1wbGUgYXBwbGljYXRpb24NCi1mcm9tIGEgV1NETCBkb2N1bWVudCB1c2luZyB0aGUgQXhpczIgcnVudGltZSBlbnZpcm9ubWVudDwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+R2VuZXJhdGluZyBhbiBBcGFjaGUgQXhpczIgSmF2YSBjbGllbnQgcHJveHkgZnJvbSBhIFdTREwgZG9jdW1lbnQ8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+VGhlIFdlYiBTZXJ2aWNlIENsaWVudCB3aXphcmQgYXNzaXN0cyB5b3UgaW4gZ2VuZXJhdGluZyBhIDx0bSB0bWNsYXNzPSJzcGVjaWFsIg0KLXRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IGJlYW4NCi1wcm94eSBhbmQgYSBzYW1wbGUgYXBwbGljYXRpb24uIFRoZSBzYW1wbGUgV2ViIGFwcGxpY2F0aW9uIGRlbW9uc3RyYXRlcyBob3cNCi10byBjb2RlIGEgcHJveHkgZmlsZS48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5BeGlzMiBydW50aW1lIGVudmlyb25tZW50PGluZGV4dGVybT5XZWIgc2VydmljZSBjbGllbnRzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5XZWIgc2VydmljZXM8aW5kZXh0ZXJtPkF4aXMyIHJ1bnRpbWUgZW52aXJvbm1lbnQ8aW5kZXh0ZXJtPldlYg0KLXNlcnZpY2UgY2xpZW50czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPHByZXJlcT48cD5QcmVyZXF1aXNpdGVzOjwvcD48b2w+DQotPGxpIGNvbnJlZj0idGF4aXMyYnUuZGl0YSN0d3NiZWFuYS9pbnN0YWxsYXhpczJsaW5rIj48L2xpPg0KLTxsaSBjb25yZWY9InRheGlzMmJ1LmRpdGEjdHdzYmVhbmEvY3JlYXRldG9tY2F0bGluayI+PC9saT48P1B1YiBDYXJldD8+DQotPGxpPkRpc2NvdmVyIGFuZCBpbXBvcnQgYSBXU0RMIGRvY3VtZW50IGludG8gdGhlIFdlYiBwcm9qZWN0LiBZb3UgY2FuIG9ubHkNCi11c2UgYSBXU0RMIGZpbGUgdGhhdCBjb250YWlucyBhIHNlcnZpY2UgZWxlbWVudC48L2xpPg0KLTwvb2w+PC9wcmVyZXE+DQotPGNvbnRleHQ+VG8gZ2VuZXJhdGUgYSA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBjbGllbnQgcHJveHkgYW5kIGEgc2FtcGxlIGFwcGxpY2F0aW9uDQotZnJvbSBhIGRpc2NvdmVyZWQgV1NETCBkb2N1bWVudDo8L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+U3dpdGNoIHRvIHRoZSBKMkVFIHBlcnNwZWN0aXZlICg8dWljb250cm9sPldpbmRvdyA+IE9wZW4gUGVyc3BlY3RpdmUNCi0+IEoyRUU8L3VpY29udHJvbD4pLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBOYXZpZ2F0b3Igdmlldywgc2VsZWN0IHRoZSBXZWIgcHJvamVjdCBpbiB3aGljaCB5b3Ugd2FudA0KLXRvIGdlbmVyYXRlIGEgc2FtcGxlIGFwcGxpY2F0aW9uLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrICA8dWljb250cm9sPkZpbGUgPiBOZXcgPiBPdGhlcjwvdWljb250cm9sPi4gU2VsZWN0ICA8dWljb250cm9sPldlYg0KLVNlcnZpY2VzPC91aWNvbnRyb2w+IGluIG9yZGVyIHRvIGRpc3BsYXkgdGhlIHZhcmlvdXMgV2ViIHNlcnZpY2Ugd2l6YXJkcy4NCi1TZWxlY3QgdGhlICA8dWljb250cm9sPldlYiBTZXJ2aWNlIENsaWVudDwvdWljb250cm9sPiB3aXphcmQuIENsaWNrICA8dWljb250cm9sPk5leHQ8L3VpY29udHJvbD4uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+V2ViIFNlcnZpY2VzIHBhZ2U6IDwvY21kPg0KLTxzdWJzdGVwcz4NCi08c3Vic3RlcD48Y21kPkVudGVyIHRoZSBVUkkgdG8gdGhlIFdTREwsIFdTSUwsIG9yIEhUTUwgZmlsZSB0aGF0IHdpbGwgYmUgdXNlZA0KLXRvIGdlbmVyYXRlIHRoZSBjbGllbnQuPC9jbWQ+PC9zdWJzdGVwPg0KLTxzdWJzdGVwPjxjbWQ+U2VsZWN0IHRoZSB0eXBlIG9mIHByb3h5IHRvIGJlIGdlbmVyYXRlZDwvY21kPjwvc3Vic3RlcD4NCi08c3Vic3RlcD48Y21kPlNlbGVjdCB0aGUgc3RhZ2VzIG9mIFdlYiBzZXJ2aWNlcyBkZXZlbG9wbWVudCB0aGF0IHlvdSB3YW50DQotdG8gY29tcGxldGUgdXNpbmcgdGhlIHNsaWRlcjo8L2NtZD48aW5mbz48dWw+DQotPGxpPkRldmVsb3A6IHRoaXMgd2lsbCBkZXZlbG9wIHRoZSBXU0RMIGRlZmluaXRpb24gYW5kIGltcGxlbWVudGF0aW9uIG9mIHRoZQ0KLVdlYiBzZXJ2aWNlLiBUaGlzIGluY2x1ZGVzIHN1Y2ggdGFza3MgYXMgY3JlYXRpbmcgdGhlIG1vZHVsZXMgd2hpY2ggd2lsbCBjb250YWluDQotdGhlIGdlbmVyYXRlZCBjb2RlIGFuZCA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBmaWxlcywgYXMgd2VsbCBhcyBjb3B5aW5nIHRoZSBBeGlzDQotSkFScy4uPC9saT4NCi08bGk+QXNzZW1ibGU6IHRoaXMgZW5zdXJlcyB0aGUgcHJvamVjdCB0aGF0IHdpbGwgaG9zdCB0aGUgV2ViIHNlcnZpY2Ugb3IgY2xpZW50DQotZ2V0cyBhc3NvY2lhdGVkIHRvIGFuIEVBUiB3aGVuIHJlcXVpcmVkIGJ5IHRoZSB0YXJnZXQgYXBwbGljYXRpb24gc2VydmVyLjwvbGk+DQotPGxpPkRlcGxveTogdGhpcyB3aWxsIGNyZWF0ZSB0aGUgZGVwbG95bWVudCBjb2RlIGZvciB0aGUgc2VydmljZS48L2xpPg0KLTxsaT5JbnN0YWxsOiB0aGlzIHdpbGwgaW5zdGFsbCBhbmQgY29uZmlndXJlIHRoZSBXZWIgbW9kdWxlIGFuZCBFQVJzIG9uIHRoZQ0KLXRhcmdldCBzZXJ2ZXIuPC9saT4NCi08bGk+U3RhcnQ6IHRoaXMgd2lsbCBzdGFydCB0aGUgc2VydmVyIG9uY2UgdGhlIHNlcnZpY2UgaGFzIGJlZW4gaW5zdGFsbGVkDQotb24gaXQuIFRoZSBzZXJ2ZXItY29uZmlnLndzZGQgZmlsZSB3aWxsIGJlIGdlbmVyYXRlZC48L2xpPg0KLTxsaT5UZXN0OiB0aGlzIHdpbGwgcHJvdmlkZSB2YXJpb3VzIG9wdGlvbnMgZm9yIHRlc3RpbmcgdGhlIHNlcnZpY2UsIHN1Y2gNCi1hcyB1c2luZyB0aGUgV2ViIFNlcnZpY2UgRXhwbG9yZXIgb3Igc2FtcGxlIEpTUHMuPC9saT4NCi08L3VsPjwvaW5mbz48L3N1YnN0ZXA+DQotPHN1YnN0ZXA+PGNtZD5TZWxlY3QgeW91ciBzZXJ2ZXI6IHRoZSBkZWZhdWx0IHNlcnZlciBpcyBkaXNwbGF5ZWQuIElmIHlvdQ0KLXdhbnQgdG8gZGVwbG95IHlvdXIgY2xpZW50IHRvIGEgZGlmZmVyZW50IHNlcnZlciBjbGljayB0aGUgbGluayB0byBzcGVjaWZ5DQotYSBkaWZmZXJlbnQgc2VydmVyLjwvY21kPjwvc3Vic3RlcD4NCi08c3Vic3RlcD48Y21kPlNlbGVjdCB5b3VyIHJ1bnRpbWU6IGVuc3VyZSB0aGUgQXBhY2hlIEF4aXMyIHJ1bnRpbWUgaXMgc2VsZWN0ZWQuPC9jbWQ+DQotPC9zdWJzdGVwPg0KLTxzdWJzdGVwPjxjbWQ+U2VsZWN0IHRoZSBjbGllbnQgcHJvamVjdDogdGhlIHByb2plY3QgY29udGFpbmluZyB0aGUgcHJvamVjdA0KLXNlbGVjdGVkIGluIHlvdXIgd29ya3NwYWNlIGlzIGRpc3BsYXllZC4gVG8gc2VsZWN0IGEgZGlmZmVyZW50IHByb2plY3QgYW5kDQotRUFSIGNsaWNrIG9uIHRoZSBwcm9qZWN0IGxpbmsuPC9jbWQ+PGluZm8+RW5zdXJlIHRoYXQgdGhlIHByb2plY3Qgc2VsZWN0ZWQNCi1hcyB0aGUgQ2xpZW50IFdlYiBQcm9qZWN0IGlzIGRpZmZlcmVudCBmcm9tIHRoZSBTZXJ2aWNlIFdlYiBQcm9qZWN0LCBvciB0aGUNCi1zZXJ2aWNlIHdpbGwgYmUgb3ZlcndyaXR0ZW4gYnkgdGhlIGNsaWVudCdzIGdlbmVyYXRlZCBhcnRpZmFjdHMuPC9pbmZvPjwvc3Vic3RlcD4NCi08c3Vic3RlcD48Y21kPk1vbml0b3IgdGhlIFdlYiBzZXJ2aWNlOiB0aGlzIHdpbGwgc2VuZCB0aGUgV2ViIHNlcnZpY2UgdHJhZmZpYw0KLXRocm91Z2ggdGhlIFRDUC9JUCBNb25pdG9yLCB3aGljaCBhbGxvd3MgeW91IHRvIHdhdGNoIHRoZSBTT0FQIHRyYWZmaWMgZ2VuZXJhdGVkDQotYnkgdGhlIFdlYiBzZXJ2aWNlIGFuZCB0byB0ZXN0IHRoaXMgdHJhZmZpYyBmb3IgV1MtSSBjb21wbGlhbmNlLiBBbHRlcm5hdGVseQ0KLXlvdSBjYW4gbWFudWFsbHkgc2V0IHVwIGEgVENQL0lQIG1vbml0b3IgYXMgZGVzY3JpYmVkIGluIDx4cmVmIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC53c2kudWkuZG9jLnVzZXIvdGFza3MvdG1vbml0b3IuZGl0YSINCi1zY29wZT0icGVlciI+VXNpbmcgdGhlIFRDUC9JUCBNb25pdG9yIHRvIHRlc3QgV2ViIHNlcnZpY2VzPC94cmVmPjwvY21kPjwvc3Vic3RlcD4NCi08L3N1YnN0ZXBzPg0KLTwvc3RlcD4NCi08c3RlcCBjb25yZWY9InRheGlzMmJ1LmRpdGEjdHdzYmVhbmEvYXhpczJjbGllbnRwYWdlbGluayI+PGNtZD5BeGlzMiBDbGllbnQNCi1XZWIgc2VydmljZSBjb25maWd1cmF0aW9uIHBhZ2U6IFVzZSB0aGlzIHBhZ2UgdG8gc2VsZWN0IHRoZSBmb2xsb3dpbmcgb3B0aW9uczogPC9jbWQ+DQotPHN1YnN0ZXBzPg0KLTxzdWJzdGVwPjxjbWQ+U2VydmljZSBOYW1lOiA8L2NtZD48L3N1YnN0ZXA+DQotPHN1YnN0ZXA+PGNtZD5Qb3J0IE5hbWU6IDwvY21kPjwvc3Vic3RlcD4NCi08c3Vic3RlcD48Y21kPkRhdGFiaW5kaW5nIE5hbWU6IE9ubHkgdGhlIEF4aXMyIERhdGFiaW5kaW5nIEZyYW1ld29yayAoQURCKQ0KLWlzIHN1cHBvcnRlZCBhdCB0aGlzIHRpbWUuPC9jbWQ+PC9zdWJzdGVwPg0KLTxzdWJzdGVwPjxjbWQ+Q3VzdG9tIHBhY2thZ2UgbmFtZTogWW91IGNhbiBjaGFuZ2UgdGhlIHBhY2thZ2UgbmFtZSBpbiB0aGlzDQotZmllbGQuPC9jbWQ+PC9zdWJzdGVwPg0KLTxzdWJzdGVwPjxjbWQ+Q2xpZW50IG1vZGU6IFlvdSBjYW4gY2hvb3NlIGlmIHRoZSBjbGllbnQgaXMgc3luY2hyb25vdXMsIGFzeW5jaHJvbm91cywNCi1vciBib3RoLjwvY21kPjwvc3Vic3RlcD4NCi08c3Vic3RlcD48Y21kPkdlbmVyYXRlIHRlc3QgY2FzZSB0byB0ZXN0IHRoZSBzZXJ2aWNlOiBJZiB5b3Ugc2VsZWN0IHRoaXMsDQotdGhlIEF4aXMyIGVtaXR0ZXIgd2lsbCBnZW5lcmF0ZSBKVW5pdCB0ZXN0Y2FzZXMgbWF0Y2hpbmcgdGhlIFdTREwgcHJvdmlkZWQNCi10byB0aGUgY2xpZW50LiBUaGVzZSBKVW5pdCB0ZXN0Y2FzZXMgd2lsbCBiZSBnZW5lcmF0ZWQgdG8gYSBuZXdseSBhZGRlZCBzb3VyY2UNCi1kaXJlY3RvcnkgdG8gdGhlIGNsaWVudCBwcm9qZWN0IGNhbGxlZCA8dWljb250cm9sPnRlc3Q8L3VpY29udHJvbD4uIDwvY21kPg0KLTwvc3Vic3RlcD4NCi08c3Vic3RlcD48Y21kPkdlbmVyYXRlIGFsbCB0eXBlcyBmb3IgYWxsIGVsZW1lbnRzIHJlZmVycmVkIGJ5IHNjaGVtYXM6PC9jbWQ+DQotPC9zdWJzdGVwPg0KLTxzdWJzdGVwPjxjbWQ+TmFtZXNwYWNlIHRvIHBhY2thZ2UgbWFwcGluZzogVXNlIHRoaXMgdGFibGUgdG8gcmV2aWV3IG9yIGVkaXQNCi10aGUgbWFwcGluZ3MgYmV0d2VlbiBwYWNrYWdlcyBhbmQgbmFtZXNwYWNlcy48L2NtZD48L3N1YnN0ZXA+DQotPC9zdWJzdGVwcz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5XZWIgU2VydmljZSBDbGllbnQgVGVzdCBwYWdlOiBVc2UgdGhpcyBwYWdlIHRvIHNlbGVjdCB0aGUgZm9sbG93aW5nDQotb3B0aW9uczogPC9jbWQ+DQotPHN1YnN0ZXBzPg0KLTxzdWJzdGVwPjxjbWQ+U2VsZWN0IHlvdXIgdGVzdCBmYWNpbGl0eS4gWW91IGNhbiB0ZXN0IHRoZSBnZW5lcmF0ZWQgcHJveHkNCi1pbiB0aGUgV2ViIFNlcnZpY2UgRXhwbG9yZXIsIG9yIHRoZSBVbml2ZXJzYWwgVGVzdCBDbGllbnQuPC9jbWQ+PC9zdWJzdGVwPg0KLTxzdWJzdGVwPjxjbWQ+U2VsZWN0ICA8dWljb250cm9sPlJ1biB0ZXN0IG9uIHNlcnZlcjwvdWljb250cm9sPiB0byBzdGFydCB0aGUNCi1zZXJ2ZXIgZm9yIHlvdSBhdXRvbWF0aWNhbGx5LjwvY21kPjwvc3Vic3RlcD4NCi08L3N1YnN0ZXBzPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrICA8dWljb250cm9sPkZpbmlzaDwvdWljb250cm9sPi4gSWYgeW91IGhhdmUgc2VsZWN0ZWQgdG8gdGVzdA0KLXRoZSBwcm94eSwgdGhlIHRlc3QgY2xpZW50IHdpbGwgb3BlbiBpbiBhIGJyb3dzZXIgd2luZG93LjwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxyZXN1bHQ+PHA+VGhlIGdlbmVyYXRlZCA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBiZWFuIHByb3h5IHByb3ZpZGVzIGEgcmVtb3RlIHByb2NlZHVyZQ0KLWNhbGwgaW50ZXJmYWNlIHRvIHRoZSBXZWIgc2VydmljZS4gVGhlIHNhbXBsZSBXZWIgYXBwbGljYXRpb24gZGVtb25zdHJhdGVzDQotaG93IHRvIGNvZGUgdGhlIHByb3h5IGZpbGUuPC9wPjxwPk9uY2UgeW91IGhhdmUgZ2VuZXJhdGVkIHlvdXIgPHRtIHRtY2xhc3M9InNwZWNpYWwiDQotdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gY2xpZW50DQotcHJveHksIHlvdSBtYXkgdGVzdCB0aGUgbWV0aG9kcyBvZiB0aGUgV2ViIHNlcnZpY2UgdGhyb3VnaCB0aGUgcHJveHkgdXNpbmcNCi1XZWIgU2VydmljZXMgc2FtcGxlIEpTUHMgb3IgdGhlIFVuaXZlcnNhbCB0ZXN0IGNsaWVudC48L3A+PHVsIG91dHB1dGNsYXNzPSJ3c2NsaWVudHRlc3RvcHRpb25zIj4NCi08bGk+SWYgeW91IGhhdmUgc2VsZWN0ZWQgdG8gdGVzdCB0aGUgZ2VuZXJhdGVkIHByb3h5IHVzaW5nIFdlYiBzZXJ2aWNlIEpTUHMsDQotdGhlIHByb3h5IGlzIGxhdW5jaGVkIGluIGEgV2ViIGJyb3dzZXIgYXQgdGhlIGZvbGxvd2luZyBVUkw6IDxjb2RlcGg+aHR0cDovL2xvY2FsaG9zdDogPHZhcm5hbWU+cG9ydDwvdmFybmFtZT4vIDx2YXJuYW1lPldlYlByb2plY3Q8L3Zhcm5hbWU+Q2xpZW50L3NhbXBsZTxpDQotPkJlYW5OYW1lPC9pPi8gPHZhcm5hbWU+V2ViU2VydmljZU5hbWU8L3Zhcm5hbWU+L1Rlc3RDbGllbnQuanNwPC9jb2RlcGg+IFlvdQ0KLWNhbiB1c2UgdGhpcyBzYW1wbGUgYXBwbGljYXRpb24gdG8gdGVzdCB0aGUgV2ViIHNlcnZpY2UgYnkgc2VsZWN0aW5nIGEgbWV0aG9kLA0KLWVudGVyaW5nIGEgdmFsdWUgZm9yIHRoZSBtZXRob2QsIGFuZCBjbGlja2luZyAgPHVpY29udHJvbD5JbnZva2U8L3VpY29udHJvbD4uDQotVGhlIHJlc3VsdCBvZiB0aGUgbWV0aG9kIHdpbGwgZGlzcGxheSBpbiB0aGUgcmVzdWx0cyBwYW5lLjwvbGk+DQotPGxpPklmIHlvdSBoYXZlIHNlbGVjdGVkIHRvIHRlc3QgdGhlIFdlYiBzZXJ2aWNlIHVzaW5nIHRoZSBXZWIgU2VydmljZXMgRXhwbG9yZXIsDQotdGhlIEV4cGxvcmVyIHdpbGwgb3Blbi4gU2VsZWN0IHRoZSBvcGVyYXRpb24geW91IHdhbnQgdG8gdGVzdCwgZW50ZXIgdGhlIHJlcXVpcmVkDQotaW5mb3JtYXRpb24sIGFuZCBjbGljayAgPGI+R288L2I+LiBUaGUgcmVzdWx0IHdpbGwgZGlzcGxheSBpbiB0aGUgU3RhdHVzIHBhbmUuPC9saT4NCi08L3VsPjxwPkZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGNyZWF0aW5nIGEgV2ViIHByb2plY3QsIHJlZmVyIHRvIHRoZSBXZWIgYXBwbGljYXRpb24NCi1kZXZlbG9wbWVudCBkb2N1bWVudGF0aW9uLjwvcD48L3Jlc3VsdD4NCi08L3Rhc2tib2R5Pg0KLTxyZWxhdGVkLWxpbmtzPg0KLTxsaW5rbGlzdD48dGl0bGU+UmVsYXRlZCBDb25jZXB0czwvdGl0bGU+DQotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LndzLmRvYy51c2VyL2NvbmNlcHRzL2N3c2lud3NhLmRpdGEiIHNjb3BlPSJwZWVyIj4NCi08bGlua3RleHQ+IFRvb2xzIGZvciBXZWIgc2VydmljZXMgZGV2ZWxvcG1lbnQ8L2xpbmt0ZXh0PjwvbGluaz4NCi08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Qud3MuZG9jLnVzZXIvY29uY2VwdHMvY3dzLmRpdGEiIHNjb3BlPSJwZWVyIj4NCi08bGlua3RleHQ+V2ViIHNlcnZpY2VzIGRldmVsb3BtZW50PC9saW5rdGV4dD48L2xpbms+DQotPC9saW5rbGlzdD4NCi08bGlua2xpc3Q+PHRpdGxlPlJlbGF0ZWQgVGFza3M8L3RpdGxlPg0KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5kb2MudXNlci90YXNrcy90dWRkaWV4cC5kaXRhIg0KLXNjb3BlPSJwZWVyIj48bGlua3RleHQ+IFVzaW5nIHRoZSBXZWIgU2VydmljZXMgRXhwbG9yZXI8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtsaXN0Pg0KLTwvcmVsYXRlZC1saW5rcz4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDgzMzQ/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyL3RvcGljcy90YXhpczJjbGllbnQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyL3RvcGljcy90YXhpczJjbGllbnQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk2ZWZhZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS5kb2MudXNlci90b3BpY3MvdGF4aXMyY2xpZW50Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iR2VuZXJhdGluZyBhIEphdmEgY2xpZW50IHByb3h5IGFuZCBhIHNhbXBsZSBhcHBsaWNhdGlvbiBmcm9tIGEgV1NETCBkb2N1bWVudCB1c2luZyB0aGUgQXhpczIgcnVudGltZSBlbnZpcm9ubWVudCIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGUgV2ViIFNlcnZpY2UgQ2xpZW50IHdpemFyZCBhc3Npc3RzIHlvdSBpbiBnZW5lcmF0aW5nIGEgSmF2YSBiZWFuIHByb3h5IGFuZCBhIHNhbXBsZSBhcHBsaWNhdGlvbi4gVGhlIHNhbXBsZSBXZWIgYXBwbGljYXRpb24gZGVtb25zdHJhdGVzIGhvdyB0byBjb2RlIGEgcHJveHkgZmlsZS4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhlIFdlYiBTZXJ2aWNlIENsaWVudCB3aXphcmQgYXNzaXN0cyB5b3UgaW4gZ2VuZXJhdGluZyBhIEphdmEgYmVhbiBwcm94eSBhbmQgYSBzYW1wbGUgYXBwbGljYXRpb24uIFRoZSBzYW1wbGUgV2ViIGFwcGxpY2F0aW9uIGRlbW9uc3RyYXRlcyBob3cgdG8gY29kZSBhIHByb3h5IGZpbGUuIiAvPgotPG1ldGEgY29udGVudD0iQXhpczIgcnVudGltZSBlbnZpcm9ubWVudCwgV2ViIHNlcnZpY2UgY2xpZW50cywgV2ViIHNlcnZpY2VzLCBXZWIgc2VydmljZSBjbGllbnRzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iQXhpczIgcnVudGltZSBlbnZpcm9ubWVudCwgV2ViIHNlcnZpY2UgY2xpZW50cywgV2ViIHNlcnZpY2VzLCBXZWIgc2VydmljZSBjbGllbnRzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2NheGlzMnRvdmVyLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC53cy5kb2MudXNlci9jb25jZXB0cy9jd3NpbndzYS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Qud3MuZG9jLnVzZXIvY29uY2VwdHMvY3dzLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5kb2MudXNlci90YXNrcy90dWRkaWV4cC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRzYW1wYXBwYSIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkdlbmVyYXRpbmcgYW4gQXBhY2hlIEF4aXMyIEphdmEgY2xpZW50IHByb3h5IGZyb20gYSBXU0RMIGRvY3VtZW50PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0c2FtcGFwcGEiPjxhIG5hbWU9InRzYW1wYXBwYSI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+R2VuZXJhdGluZyBhIEphdmEgY2xpZW50IHByb3h5IGFuZCBhIHNhbXBsZSBhcHBsaWNhdGlvbgotZnJvbSBhIFdTREwgZG9jdW1lbnQgdXNpbmcgdGhlIEF4aXMyIHJ1bnRpbWUgZW52aXJvbm1lbnQ8L2gxPgotCi0KLQotCi08ZGl2PjxwPlRoZSBXZWIgU2VydmljZSBDbGllbnQgd2l6YXJkIGFzc2lzdHMgeW91IGluIGdlbmVyYXRpbmcgYSBKYXZh4oSiIGJlYW4KLXByb3h5IGFuZCBhIHNhbXBsZSBhcHBsaWNhdGlvbi4gVGhlIHNhbXBsZSBXZWIgYXBwbGljYXRpb24gZGVtb25zdHJhdGVzIGhvdwotdG8gY29kZSBhIHByb3h5IGZpbGUuPC9wPgotCi08ZGl2IGNsYXNzPSJwIj48cD5QcmVyZXF1aXNpdGVzOjwvcD4KLTxvbD4KLTxsaT5Zb3UgbXVzdCBoYXZlIGluc3RhbGxlZCB0aGUgQXBhY2hlIEF4aXMyIHJ1bnRpbWUKLWVudmlyb25tZW50IGFzIGRlc2NyaWJlZCBpbjogPGEgaHJlZj0iY2F4aXMydG92ZXIuaHRtbCIgdGl0bGU9IlRoaXMgcnVudGltZSBlbnZpcm9ubWVudCBpcyBmb3IgdXNlcnMgd2hvIHByZWZlciB0byBkZXZlbG9wIGZvciYjMTA7dGhlIG9wZW4gQXBhY2hlIEF4aXMgcGxhdGZvcm0uIEJvdGggQXhpczEgYW5kIEF4aXMyIGFyZSBzdXBwb3J0ZWQgYnkgdGhlIFdlYiYjMTA7c2VydmljZXMgdG9vbHMuIj5DcmVhdGluZyBXZWIgc2VydmljZXMgd2l0aCB0aGUgQXBhY2hlIEF4aXMyIHJ1bnRpbWUgZW52aXJvbm1lbnRzPC9hPjwvbGk+Ci0KLTxsaT5JZiB5b3UgYXJlIHVzaW5nIHRoZSBBcGFjaGUgSmFrYXJ0YSBUb21jYXQgc2VydmxldAotY29udGFpbmVyIGFzIHlvdXIgc2VydmVyLCB5b3UgbXVzdCBpbnN0YWxsIGl0LCBjb25maWd1cmUgYW4gaW5zdGFuY2Ugb2YgaXQsCi1hbmQgY3JlYXRlIGEgV2ViIHByb2plY3QgdGFyZ2V0ZWQgdG8gaXQgYXMgZGVzY3JpYmVkIGluOiA8YSBocmVmPSIuLi9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy51aS5kb2MudXNlci90b3BpY3MvdHRvbWNhdHNlcnYuaHRtbCI+Q3JlYXRpbmcgYW4gQXBhY2hlIFRvbWNhdCBzZXJ2ZXIgYW5kIFdlYiBwcm9qZWN0PC9hPjwvbGk+Ci0KLTxsaT5EaXNjb3ZlciBhbmQgaW1wb3J0IGEgV1NETCBkb2N1bWVudCBpbnRvIHRoZSBXZWIgcHJvamVjdC4gWW91IGNhbiBvbmx5Ci11c2UgYSBXU0RMIGZpbGUgdGhhdCBjb250YWlucyBhIHNlcnZpY2UgZWxlbWVudC48L2xpPgotCi08L29sPgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPlRvIGdlbmVyYXRlIGEgSmF2YSBjbGllbnQgcHJveHkgYW5kIGEgc2FtcGxlIGFwcGxpY2F0aW9uCi1mcm9tIGEgZGlzY292ZXJlZCBXU0RMIGRvY3VtZW50OjwvZGl2PgotCi08b2w+Ci08bGk+PHNwYW4+U3dpdGNoIHRvIHRoZSBKMkVFIHBlcnNwZWN0aXZlICg8c3BhbiBjbGFzcz0idWljb250cm9sIj5XaW5kb3cgJmd0OyBPcGVuIFBlcnNwZWN0aXZlCi0mZ3Q7IEoyRUU8L3NwYW4+KS48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkluIHRoZSBOYXZpZ2F0b3Igdmlldywgc2VsZWN0IHRoZSBXZWIgcHJvamVjdCBpbiB3aGljaCB5b3Ugd2FudAotdG8gZ2VuZXJhdGUgYSBzYW1wbGUgYXBwbGljYXRpb24uPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5DbGljayAgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmlsZSAmZ3Q7IE5ldyAmZ3Q7IE90aGVyPC9zcGFuPi4gU2VsZWN0ICA8c3BhbiBjbGFzcz0idWljb250cm9sIj5XZWIKLVNlcnZpY2VzPC9zcGFuPiBpbiBvcmRlciB0byBkaXNwbGF5IHRoZSB2YXJpb3VzIFdlYiBzZXJ2aWNlIHdpemFyZHMuCi1TZWxlY3QgdGhlICA8c3BhbiBjbGFzcz0idWljb250cm9sIj5XZWIgU2VydmljZSBDbGllbnQ8L3NwYW4+IHdpemFyZC4gQ2xpY2sgIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5leHQ8L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaT48c3Bhbj5XZWIgU2VydmljZXMgcGFnZTogPC9zcGFuPgotPG9sIHR5cGU9ImEiPgotPGxpIGNsYXNzPSJzdWJzdGVwZXhwYW5kIj48c3Bhbj5FbnRlciB0aGUgVVJJIHRvIHRoZSBXU0RMLCBXU0lMLCBvciBIVE1MIGZpbGUgdGhhdCB3aWxsIGJlIHVzZWQKLXRvIGdlbmVyYXRlIHRoZSBjbGllbnQuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3Vic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IHRoZSB0eXBlIG9mIHByb3h5IHRvIGJlIGdlbmVyYXRlZDwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN1YnN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCB0aGUgc3RhZ2VzIG9mIFdlYiBzZXJ2aWNlcyBkZXZlbG9wbWVudCB0aGF0IHlvdSB3YW50Ci10byBjb21wbGV0ZSB1c2luZyB0aGUgc2xpZGVyOjwvc3Bhbj4gPHVsPgotPGxpPkRldmVsb3A6IHRoaXMgd2lsbCBkZXZlbG9wIHRoZSBXU0RMIGRlZmluaXRpb24gYW5kIGltcGxlbWVudGF0aW9uIG9mIHRoZQotV2ViIHNlcnZpY2UuIFRoaXMgaW5jbHVkZXMgc3VjaCB0YXNrcyBhcyBjcmVhdGluZyB0aGUgbW9kdWxlcyB3aGljaCB3aWxsIGNvbnRhaW4KLXRoZSBnZW5lcmF0ZWQgY29kZSBhbmQgSmF2YSBmaWxlcywgYXMgd2VsbCBhcyBjb3B5aW5nIHRoZSBBeGlzCi1KQVJzLi48L2xpPgotCi08bGk+QXNzZW1ibGU6IHRoaXMgZW5zdXJlcyB0aGUgcHJvamVjdCB0aGF0IHdpbGwgaG9zdCB0aGUgV2ViIHNlcnZpY2Ugb3IgY2xpZW50Ci1nZXRzIGFzc29jaWF0ZWQgdG8gYW4gRUFSIHdoZW4gcmVxdWlyZWQgYnkgdGhlIHRhcmdldCBhcHBsaWNhdGlvbiBzZXJ2ZXIuPC9saT4KLQotPGxpPkRlcGxveTogdGhpcyB3aWxsIGNyZWF0ZSB0aGUgZGVwbG95bWVudCBjb2RlIGZvciB0aGUgc2VydmljZS48L2xpPgotCi08bGk+SW5zdGFsbDogdGhpcyB3aWxsIGluc3RhbGwgYW5kIGNvbmZpZ3VyZSB0aGUgV2ViIG1vZHVsZSBhbmQgRUFScyBvbiB0aGUKLXRhcmdldCBzZXJ2ZXIuPC9saT4KLQotPGxpPlN0YXJ0OiB0aGlzIHdpbGwgc3RhcnQgdGhlIHNlcnZlciBvbmNlIHRoZSBzZXJ2aWNlIGhhcyBiZWVuIGluc3RhbGxlZAotb24gaXQuIFRoZSBzZXJ2ZXItY29uZmlnLndzZGQgZmlsZSB3aWxsIGJlIGdlbmVyYXRlZC48L2xpPgotCi08bGk+VGVzdDogdGhpcyB3aWxsIHByb3ZpZGUgdmFyaW91cyBvcHRpb25zIGZvciB0ZXN0aW5nIHRoZSBzZXJ2aWNlLCBzdWNoCi1hcyB1c2luZyB0aGUgV2ViIFNlcnZpY2UgRXhwbG9yZXIgb3Igc2FtcGxlIEpTUHMuPC9saT4KLQotPC91bD4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3Vic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IHlvdXIgc2VydmVyOiB0aGUgZGVmYXVsdCBzZXJ2ZXIgaXMgZGlzcGxheWVkLiBJZiB5b3UKLXdhbnQgdG8gZGVwbG95IHlvdXIgY2xpZW50IHRvIGEgZGlmZmVyZW50IHNlcnZlciBjbGljayB0aGUgbGluayB0byBzcGVjaWZ5Ci1hIGRpZmZlcmVudCBzZXJ2ZXIuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3Vic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IHlvdXIgcnVudGltZTogZW5zdXJlIHRoZSBBcGFjaGUgQXhpczIgcnVudGltZSBpcyBzZWxlY3RlZC48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN1YnN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCB0aGUgY2xpZW50IHByb2plY3Q6IHRoZSBwcm9qZWN0IGNvbnRhaW5pbmcgdGhlIHByb2plY3QKLXNlbGVjdGVkIGluIHlvdXIgd29ya3NwYWNlIGlzIGRpc3BsYXllZC4gVG8gc2VsZWN0IGEgZGlmZmVyZW50IHByb2plY3QgYW5kCi1FQVIgY2xpY2sgb24gdGhlIHByb2plY3QgbGluay48L3NwYW4+IEVuc3VyZSB0aGF0IHRoZSBwcm9qZWN0IHNlbGVjdGVkCi1hcyB0aGUgQ2xpZW50IFdlYiBQcm9qZWN0IGlzIGRpZmZlcmVudCBmcm9tIHRoZSBTZXJ2aWNlIFdlYiBQcm9qZWN0LCBvciB0aGUKLXNlcnZpY2Ugd2lsbCBiZSBvdmVyd3JpdHRlbiBieSB0aGUgY2xpZW50J3MgZ2VuZXJhdGVkIGFydGlmYWN0cy48L2xpPgotCi08bGkgY2xhc3M9InN1YnN0ZXBleHBhbmQiPjxzcGFuPk1vbml0b3IgdGhlIFdlYiBzZXJ2aWNlOiB0aGlzIHdpbGwgc2VuZCB0aGUgV2ViIHNlcnZpY2UgdHJhZmZpYwotdGhyb3VnaCB0aGUgVENQL0lQIE1vbml0b3IsIHdoaWNoIGFsbG93cyB5b3UgdG8gd2F0Y2ggdGhlIFNPQVAgdHJhZmZpYyBnZW5lcmF0ZWQKLWJ5IHRoZSBXZWIgc2VydmljZSBhbmQgdG8gdGVzdCB0aGlzIHRyYWZmaWMgZm9yIFdTLUkgY29tcGxpYW5jZS4gQWx0ZXJuYXRlbHkKLXlvdSBjYW4gbWFudWFsbHkgc2V0IHVwIGEgVENQL0lQIG1vbml0b3IgYXMgZGVzY3JpYmVkIGluIDxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC53c2kudWkuZG9jLnVzZXIvdGFza3MvdG1vbml0b3IuaHRtbCI+VXNpbmcgdGhlIFRDUC9JUCBNb25pdG9yIHRvIHRlc3QgV2ViIHNlcnZpY2VzPC9hPjwvc3Bhbj48L2xpPgotCi08L29sPgotCi08L2xpPgotCi08bGk+PHNwYW4+QXhpczIgQ2xpZW50IFdlYiBzZXJ2aWNlIGNvbmZpZ3VyYXRpb24KLXBhZ2U6IFVzZSB0aGlzIHBhZ2UgdG8gc2VsZWN0IHRoZSBmb2xsb3dpbmcgb3B0aW9uczogPC9zcGFuPgotPG9sIHR5cGU9ImEiPgotPGxpPjxzcGFuPlNlcnZpY2UgTmFtZTogYWNjZXB0IHRoZSBkZWZhdWx0Ljwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+UG9ydCBOYW1lOiBhY2NlcHQgdGhlIGRlZmF1bHQuPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5EYXRhYmluZGluZyBOYW1lOiBvbmx5IHRoZSBBeGlzMiBEYXRhYmluZGluZyBGcmFtZXdvcmsgKEFEQikKLWlzIHN1cHBvcnRlZCBhdCB0aGlzIHRpbWUuPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5DdXN0b20gcGFja2FnZSBuYW1lOiBZb3UgY2FuIGNoYW5nZSB0aGUgcGFja2FnZSBuYW1lIGluIHRoaXMKLWZpZWxkLjwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+Q2xpZW50IG1vZGU6IFlvdSBjYW4gY2hvb3NlIGlmIHRoZSBjbGllbnQgaXMgc3luY2hyb25vdXMsIGFzeW5jaHJvbm91cywKLW9yIGJvdGguPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5HZW5lcmF0ZSB0ZXN0IGNhc2UgdG8gdGVzdCB0aGUgc2VydmljZTogSWYgeW91IHNlbGVjdCB0aGlzLAotdGhlIEF4aXMyIGVtaXR0ZXIgd2lsbCBnZW5lcmF0ZSBKVW5pdCB0ZXN0Y2FzZXMgbWF0Y2hpbmcgdGhlIFdTREwgcHJvdmlkZWQKLXRvIHRoZSBjbGllbnQuIFRoZXNlIEpVbml0IHRlc3RjYXNlcyB3aWxsIGJlIGdlbmVyYXRlZCB0byBhIG5ld2x5IGFkZGVkIHNvdXJjZQotZGlyZWN0b3J5IHRvIHRoZSBjbGllbnQgcHJvamVjdCBjYWxsZWQgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+dGVzdDwvc3Bhbj4uIDwvc3Bhbj4KLTwvbGk+Ci0KLTxsaT48c3Bhbj5HZW5lcmF0ZSBhbGwgdHlwZXMgZm9yIGFsbCBlbGVtZW50cyByZWZlcnJlZCBieSBzY2hlbWFzPC9zcGFuPgotPC9saT4KLQotPGxpPjxzcGFuPk5hbWVzcGFjZSB0byBwYWNrYWdlIG1hcHBpbmc6IFVzZSB0aGlzIHRhYmxlIHRvIHJldmlldyBvciBlZGl0Ci10aGUgbWFwcGluZ3MgYmV0d2VlbiBwYWNrYWdlcyBhbmQgbmFtZXNwYWNlcy48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPC9saT4KLQotPGxpPjxzcGFuPldlYiBTZXJ2aWNlIENsaWVudCBUZXN0IHBhZ2U6IFVzZSB0aGlzIHBhZ2UgdG8gc2VsZWN0IHRoZSBmb2xsb3dpbmcKLW9wdGlvbnM6IDwvc3Bhbj4KLTxvbCB0eXBlPSJhIj4KLTxsaT48c3Bhbj5TZWxlY3QgeW91ciB0ZXN0IGZhY2lsaXR5LiBZb3UgY2FuIHRlc3QgdGhlIGdlbmVyYXRlZCBwcm94eQotaW4gdGhlIFdlYiBTZXJ2aWNlIEV4cGxvcmVyLCBvciB0aGUgVW5pdmVyc2FsIFRlc3QgQ2xpZW50Ljwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+U2VsZWN0ICA8c3BhbiBjbGFzcz0idWljb250cm9sIj5SdW4gdGVzdCBvbiBzZXJ2ZXI8L3NwYW4+IHRvIHN0YXJ0IHRoZQotc2VydmVyIGZvciB5b3UgYXV0b21hdGljYWxseS48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPC9saT4KLQotPGxpPjxzcGFuPkNsaWNrICA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaW5pc2g8L3NwYW4+LiBJZiB5b3UgaGF2ZSBzZWxlY3RlZCB0byB0ZXN0Ci10aGUgcHJveHksIHRoZSB0ZXN0IGNsaWVudCB3aWxsIG9wZW4gaW4gYSBicm93c2VyIHdpbmRvdy48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIGdlbmVyYXRlZCBKYXZhIGJlYW4gcHJveHkgcHJvdmlkZXMgYSByZW1vdGUgcHJvY2VkdXJlCi1jYWxsIGludGVyZmFjZSB0byB0aGUgV2ViIHNlcnZpY2UuIFRoZSBzYW1wbGUgV2ViIGFwcGxpY2F0aW9uIGRlbW9uc3RyYXRlcwotaG93IHRvIGNvZGUgdGhlIHByb3h5IGZpbGUuPC9wPgotPHA+T25jZSB5b3UgaGF2ZSBnZW5lcmF0ZWQgeW91ciBKYXZhIGNsaWVudAotcHJveHksIHlvdSBtYXkgdGVzdCB0aGUgbWV0aG9kcyBvZiB0aGUgV2ViIHNlcnZpY2UgdGhyb3VnaCB0aGUgcHJveHkgdXNpbmcKLVdlYiBTZXJ2aWNlcyBzYW1wbGUgSlNQcyBvciB0aGUgVW5pdmVyc2FsIHRlc3QgY2xpZW50LjwvcD4KLTx1bCBjbGFzcz0id3NjbGllbnR0ZXN0b3B0aW9ucyI+Ci08bGk+SWYgeW91IGhhdmUgc2VsZWN0ZWQgdG8gdGVzdCB0aGUgZ2VuZXJhdGVkIHByb3h5IHVzaW5nIFdlYiBzZXJ2aWNlIEpTUHMsCi10aGUgcHJveHkgaXMgbGF1bmNoZWQgaW4gYSBXZWIgYnJvd3NlciBhdCB0aGUgZm9sbG93aW5nIFVSTDogPHNhbXAgY2xhc3M9ImNvZGVwaCI+aHR0cDovL2xvY2FsaG9zdDogPHZhciBjbGFzcz0idmFybmFtZSI+cG9ydDwvdmFyPi8gPHZhciBjbGFzcz0idmFybmFtZSI+V2ViUHJvamVjdDwvdmFyPkNsaWVudC9zYW1wbGU8ZW0+QmVhbk5hbWU8L2VtPi8gPHZhciBjbGFzcz0idmFybmFtZSI+V2ViU2VydmljZU5hbWU8L3Zhcj4vVGVzdENsaWVudC5qc3A8L3NhbXA+IFlvdQotY2FuIHVzZSB0aGlzIHNhbXBsZSBhcHBsaWNhdGlvbiB0byB0ZXN0IHRoZSBXZWIgc2VydmljZSBieSBzZWxlY3RpbmcgYSBtZXRob2QsCi1lbnRlcmluZyBhIHZhbHVlIGZvciB0aGUgbWV0aG9kLCBhbmQgY2xpY2tpbmcgIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkludm9rZTwvc3Bhbj4uCi1UaGUgcmVzdWx0IG9mIHRoZSBtZXRob2Qgd2lsbCBkaXNwbGF5IGluIHRoZSByZXN1bHRzIHBhbmUuPC9saT4KLQotPGxpPklmIHlvdSBoYXZlIHNlbGVjdGVkIHRvIHRlc3QgdGhlIFdlYiBzZXJ2aWNlIHVzaW5nIHRoZSBXZWIgU2VydmljZXMgRXhwbG9yZXIsCi10aGUgRXhwbG9yZXIgd2lsbCBvcGVuLiBTZWxlY3QgdGhlIG9wZXJhdGlvbiB5b3Ugd2FudCB0byB0ZXN0LCBlbnRlciB0aGUgcmVxdWlyZWQKLWluZm9ybWF0aW9uLCBhbmQgY2xpY2sgIDxzdHJvbmc+R288L3N0cm9uZz4uIFRoZSByZXN1bHQgd2lsbCBkaXNwbGF5IGluIHRoZSBTdGF0dXMgcGFuZS48L2xpPgotCi08L3VsPgotPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24gb24gY3JlYXRpbmcgYSBXZWIgcHJvamVjdCwgcmVmZXIgdG8gdGhlIFdlYiBhcHBsaWNhdGlvbgotZGV2ZWxvcG1lbnQgZG9jdW1lbnRhdGlvbi48L3A+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iLi4vdG9waWNzL2NheGlzMnRvdmVyLmh0bWwiIHRpdGxlPSJUaGlzIHJ1bnRpbWUgZW52aXJvbm1lbnQgaXMgZm9yIHVzZXJzIHdobyBwcmVmZXIgdG8gZGV2ZWxvcCBmb3IgdGhlIG9wZW4gQXBhY2hlIEF4aXMgcGxhdGZvcm0uIEJvdGggQXhpczEgYW5kIEF4aXMyIGFyZSBzdXBwb3J0ZWQgYnkgdGhlIFdlYiBzZXJ2aWNlcyB0b29scy4iPkNyZWF0aW5nIFdlYiBzZXJ2aWNlcyB3aXRoIHRoZSBBcGFjaGUgQXhpczIgcnVudGltZSBlbnZpcm9ubWVudHM8L2E+PC9kaXY+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ibGlua2xpc3QiPjxzdHJvbmc+UmVsYXRlZCBDb25jZXB0czwvc3Ryb25nPjxiciAvPgotCi08ZGl2PjxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC53cy5kb2MudXNlci9jb25jZXB0cy9jd3NpbndzYS5odG1sIj4gVG9vbHMgZm9yIFdlYiBzZXJ2aWNlcyBkZXZlbG9wbWVudDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LndzLmRvYy51c2VyL2NvbmNlcHRzL2N3cy5odG1sIj5XZWIgc2VydmljZXMgZGV2ZWxvcG1lbnQ8L2E+PC9kaXY+PC9kaXY+Ci0KLTxkaXYgY2xhc3M9ImxpbmtsaXN0Ij48c3Ryb25nPlJlbGF0ZWQgVGFza3M8L3N0cm9uZz48YnIgLz4KLQotPGRpdj48YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkuZG9jLnVzZXIvdGFza3MvdHVkZGlleHAuaHRtbCI+IFVzaW5nIHRoZSBXZWIgU2VydmljZXMgRXhwbG9yZXI8L2E+PC9kaXY+PC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyL3RvcGljcy90YXhpczJ0ZC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvdG9waWNzL3RheGlzMnRkLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlOWM0ODcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvdG9waWNzL3RheGlzMnRkLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAiLi4vLi4vZHRkL3Rhc2suZHRkIj4NCi08P1B1YiBJbmM/Pg0KLTx0YXNrIGlkPSJ0c2tsd3NkbGEiIHhtbDpsYW5nPSJlbi11cyI+PD9QdWIgQ2FyZXQ/Pg0KLTx0aXRsZT5DcmVhdGluZyBhIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIg0KLXRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IGJlYW4gc2tlbGV0b24gZnJvbSBhIFdTREwgZG9jdW1lbnQgdXNpbmcgdGhlIEFwYWNoZQ0KLUF4aXMyIHJ1bnRpbWUgZW52aXJvbm1lbnQ8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkNyZWF0aW5nIGEgSmF2YSBiZWFuIHNrZWxldG9uIGZyb20gYSBXU0RMIGRvY3VtZW50IHVzaW5nIHRoZQ0KLUFwYWNoZSBBeGlzMiBydW50aW1lIGVudmlyb25tZW50PC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPlRoZSBXZWIgc2VydmljZSB3aXphcmQgYXNzaXN0cyB5b3UgaW4gY3JlYXRpbmcgYSBza2VsZXRvbiBiZWFuDQotZnJvbSBhbiBleGlzdGluZyBXU0RMIGRvY3VtZW50LiBUaGUgc2tlbGV0b24gYmVhbiBjb250YWlucyBhIHNldCBvZiBtZXRob2RzDQotdGhhdCBjb3JyZXNwb25kIHRvIHRoZSBvcGVyYXRpb25zIGRlc2NyaWJlZCBpbiB0aGUgV1NETCBkb2N1bWVudC4gV2hlbiB0aGUNCi1iZWFuIGlzIGNyZWF0ZWQsIGVhY2ggbWV0aG9kIGhhcyBhIHRyaXZpYWwgaW1wbGVtZW50YXRpb24gdGhhdCB5b3UgcmVwbGFjZQ0KLWJ5IGVkaXRpbmcgdGhlIGJlYW4uPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+QXhpczIgcnVudGltZSBlbnZpcm9ubWVudDxpbmRleHRlcm0+c2tlbGV0b24gV2ViIHNlcnZpY2VzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5XZWIgc2VydmljZXM8aW5kZXh0ZXJtPkF4aXMyIHJ1bnRpbWUgZW52aXJvbm1lbnQ8aW5kZXh0ZXJtPnNrZWxldG9uDQotV2ViIHNlcnZpY2VzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08cHJlcmVxPjxwPlByZXJlcXVpc2l0ZXM6PC9wPjxvbD4NCi08bGkgY29ucmVmPSJ0YXhpczJidS5kaXRhI3R3c2JlYW5hL2luc3RhbGxheGlzMmxpbmsiPjwvbGk+DQotPGxpIGNvbnJlZj0idGF4aXMyYnUuZGl0YSN0d3NiZWFuYS9jcmVhdGV0b21jYXRsaW5rIj48L2xpPg0KLTxsaT5DcmVhdGUgb3IgaW1wb3J0IGEgV1NETCBmaWxlIGludG8gdGhlIFdlYiBDb250ZW50IGZvbGRlciBvZiB0aGUgV2ViIHByb2plY3QuDQotWW91IGNhbiBvbmx5IHVzZSBhIFdTREwgZmlsZSB0aGF0IGNvbnRhaW5zIGEgc2VydmljZSBlbGVtZW50LjwvbGk+DQotPC9vbD48L3ByZXJlcT4NCi08Y29udGV4dD5UbyBjcmVhdGUgYSBXZWIgc2VydmljZSBmcm9tIGEgV1NETCBmaWxlIHVzaW5nIHRoZSBBcGFjaGUgQXhpczIgcnVudGltZQ0KLWVudmlyb25tZW50OjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5Td2l0Y2ggdG8gdGhlIEoyRUUgcGVyc3BlY3RpdmUgKDx1aWNvbnRyb2w+V2luZG93ID4gT3BlbiBQZXJzcGVjdGl2ZQ0KLT4gSjJFRTwvdWljb250cm9sPikuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldywgc2VsZWN0IHRoZSBXU0RMIGZpbGUgdGhhdCB5b3UgY3JlYXRlZA0KLW9yIGltcG9ydGVkIGludG8gdGhlIFdlYiBDb250ZW50IGZvbGRlciBvZiB5b3VyIFdlYiBwcm9qZWN0LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrICA8dWljb250cm9sPkZpbGUgPiBOZXcgPiBPdGhlcjwvdWljb250cm9sPi4gU2VsZWN0ICA8dWljb250cm9sPldlYg0KLVNlcnZpY2VzPC91aWNvbnRyb2w+IGluIG9yZGVyIHRvIGRpc3BsYXkgdGhlIHZhcmlvdXMgV2ViIHNlcnZpY2Ugd2l6YXJkcy4NCi1TZWxlY3QgdGhlICA8dWljb250cm9sPldlYiBTZXJ2aWNlPC91aWNvbnRyb2w+IHdpemFyZC4gQ2xpY2sgIDx1aWNvbnRyb2w+TmV4dDwvdWljb250cm9sPi48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5XZWIgU2VydmljZXMgcGFnZTogc2VsZWN0ICA8dWljb250cm9sPlRvcCBkb3duIEphdmEgYmVhbiBXZWIgc2VydmljZTwvdWljb250cm9sPiBhcw0KLXlvdXIgV2ViIHNlcnZpY2UgdHlwZSwgYW5kIGVudGVyIHRoZSBVUkkgdG8gdGhlIFdTREwsIFdTSUwsIG9yIEhUTUwgZmlsZSB0aGF0DQotd2lsbCBiZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBzZXJ2aWNlLjwvY21kPg0KLTxzdWJzdGVwcyBjb25yZWY9InRheGlzMmJ1LmRpdGEjdHdzYmVhbmEvY3JlYXRlc3RlcDR1bCI+DQotPHN1YnN0ZXA+PGNtZD48L2NtZD48L3N1YnN0ZXA+DQotPC9zdWJzdGVwcz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5BeGlzMiBXZWIgU2VydmljZSBTa2VsZXRvbiA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBCZWFuIENvbmZpZ3VyYXRpb24gcGFnZTogU2VsZWN0IHRoZQ0KLWZvbGRlciB3aGVyZSB0aGUgZ2VuZXJhdGVkIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IHdpbGwgYmUgc3RvcmVkLiBJZiB5b3Ugd2FudCB0byByZXZpZXcNCi1vciBlZGl0IHRoZSBtYXBwaW5ncyBiZXR3ZWVuIHBhY2thZ2VzIGFuZCBuYW1lc3BhY2VzLCBzZWxlY3QgdGhlICA8dWljb250cm9sPkRlZmluZQ0KLWN1c3RvbSBtYXBwaW5nIGZvciBuYW1lc3BhY2UgdG8gcGFja2FnZTwvdWljb250cm9sPiBjaGVjayBib3guIENsaWNrICA8dWljb250cm9sPk5leHQ8L3VpY29udHJvbD4uPC9jbWQ+DQotPHN1YnN0ZXBzPg0KLTxzdWJzdGVwPjxjbWQ+U2VydmljZSBOYW1lOiBhY2NlcHQgdGhlIGRlZmF1bHQuPC9jbWQ+PC9zdWJzdGVwPg0KLTxzdWJzdGVwPjxjbWQ+UG9ydCBOYW1lOmFjY2VwdCB0aGUgZGVmYXVsdC48L2NtZD48L3N1YnN0ZXA+DQotPHN1YnN0ZXA+PGNtZD5EYXRhYmluZGluZyBOYW1lOiBPbmx5IHRoZSBBeGlzMiBEYXRhYmluZGluZyBGcmFtZXdvcmsgKEFEQikNCi1pcyBzdXBwb3J0ZWQgYXQgdGhpcyB0aW1lLjwvY21kPjwvc3Vic3RlcD4NCi08c3Vic3RlcD48Y21kPkN1c3RvbSBwYWNrYWdlIG5hbWU6IFlvdSBjYW4gY2hhbmdlIHRoZSBwYWNrYWdlIG5hbWUgaW4gdGhpcw0KLWZpZWxkLjwvY21kPjwvc3Vic3RlcD4NCi08c3Vic3RlcD48Y21kPkdlbmVyYXRlIGFuIEludGVyZmFjZSBmb3IgU2tlbGV0b248L2NtZD48L3N1YnN0ZXA+DQotPHN1YnN0ZXA+PGNtZD5HZW5lcmF0ZSBhbGwgdHlwZXMgZm9yIGFsbCBlbGVtZW50cyByZWZlcnJlZCBieSBzY2hlbWFzPC9jbWQ+DQotPC9zdWJzdGVwPg0KLTxzdWJzdGVwPjxjbWQ+TmFtZXNwYWNlIHRvIHBhY2thZ2UgbWFwcGluZzogVXNlIHRoaXMgdGFibGUgdG8gcmV2aWV3IG9yIGVkaXQNCi10aGUgbWFwcGluZ3MgYmV0d2VlbiBwYWNrYWdlcyBhbmQgbmFtZXNwYWNlcy48L2NtZD48L3N1YnN0ZXA+DQotPC9zdWJzdGVwcz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5UZXN0IFdlYiBTZXJ2aWNlIHBhZ2U6IElmIHlvdSBzZWxlY3RlZCB0byB0ZXN0IHRoZSBXZWIgc2VydmljZSwNCi1zZWxlY3QgdGhlIHRlc3QgZmFjaWxpdHkgZm9yIHRoZSBnZW5lcmF0ZWQgV2ViIHNlcnZpY2UuIFRoaXMgd2lsbCBvcGVuIHRoZQ0KLVdlYiBzZXJ2aWNlIGluIHRoZSBXZWIgU2VydmljZXMgRXhwbG9yZXIuIFNlbGVjdCB0aGUgb3BlcmF0aW9uIHlvdSB3YW50IHRvDQotdGVzdCwgZW50ZXIgdGhlIHJlcXVpcmVkIGluZm9ybWF0aW9uLCBhbmQgY2xpY2sgIDx1aWNvbnRyb2w+R288L3VpY29udHJvbD4uDQotVGhlIHJlc3VsdCB3aWxsIGRpc3BsYXkgaW4gdGhlIFN0YXR1cyBwYW5lLiBDbGljayAgPHVpY29udHJvbD5OZXh0PC91aWNvbnRyb2w+LjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcCBjb25yZWY9InRheGlzMmJ1LmRpdGEjdHdzYmVhbmEvYXhpczJjbGllbnRwYWdlbGluayI+PGNtZD5BeGlzMiBDbGllbnQNCi1XZWIgc2VydmljZSBjb25maWd1cmF0aW9uIHBhZ2U6IFVzZSB0aGlzIHBhZ2UgdG8gc2VsZWN0IHRoZSBmb2xsb3dpbmcgb3B0aW9uczogPC9jbWQ+DQotPHN1YnN0ZXBzPg0KLTxzdWJzdGVwPjxjbWQ+U2VydmljZSBOYW1lOiA8L2NtZD48L3N1YnN0ZXA+DQotPHN1YnN0ZXA+PGNtZD5Qb3J0IE5hbWU6IDwvY21kPjwvc3Vic3RlcD4NCi08c3Vic3RlcD48Y21kPkRhdGFiaW5kaW5nIE5hbWU6IE9ubHkgdGhlIEF4aXMyIERhdGFiaW5kaW5nIEZyYW1ld29yayAoQURCKQ0KLWlzIHN1cHBvcnRlZCBhdCB0aGlzIHRpbWUuPC9jbWQ+PC9zdWJzdGVwPg0KLTxzdWJzdGVwPjxjbWQ+Q3VzdG9tIHBhY2thZ2UgbmFtZTogWW91IGNhbiBjaGFuZ2UgdGhlIHBhY2thZ2UgbmFtZSBpbiB0aGlzDQotZmllbGQuPC9jbWQ+PC9zdWJzdGVwPg0KLTxzdWJzdGVwPjxjbWQ+Q2xpZW50IG1vZGU6IFlvdSBjYW4gY2hvb3NlIGlmIHRoZSBjbGllbnQgaXMgc3luY2hyb25vdXMsIGFzeW5jaHJvbm91cywNCi1vciBib3RoLjwvY21kPjwvc3Vic3RlcD4NCi08c3Vic3RlcD48Y21kPkdlbmVyYXRlIHRlc3QgY2FzZSB0byB0ZXN0IHRoZSBzZXJ2aWNlOiBJZiB5b3Ugc2VsZWN0IHRoaXMsDQotdGhlIEF4aXMyIGVtaXR0ZXIgd2lsbCBnZW5lcmF0ZSBKVW5pdCB0ZXN0Y2FzZXMgbWF0Y2hpbmcgdGhlIFdTREwgcHJvdmlkZWQNCi10byB0aGUgY2xpZW50LiBUaGVzZSBKVW5pdCB0ZXN0Y2FzZXMgd2lsbCBiZSBnZW5lcmF0ZWQgdG8gYSBuZXdseSBhZGRlZCBzb3VyY2UNCi1kaXJlY3RvcnkgdG8gdGhlIGNsaWVudCBwcm9qZWN0IGNhbGxlZCA8dWljb250cm9sPnRlc3Q8L3VpY29udHJvbD4uIDwvY21kPg0KLTwvc3Vic3RlcD4NCi08c3Vic3RlcD48Y21kPkdlbmVyYXRlIGFsbCB0eXBlcyBmb3IgYWxsIGVsZW1lbnRzIHJlZmVycmVkIGJ5IHNjaGVtYXM6PC9jbWQ+DQotPC9zdWJzdGVwPg0KLTxzdWJzdGVwPjxjbWQ+TmFtZXNwYWNlIHRvIHBhY2thZ2UgbWFwcGluZzogVXNlIHRoaXMgdGFibGUgdG8gcmV2aWV3IG9yIGVkaXQNCi10aGUgbWFwcGluZ3MgYmV0d2VlbiBwYWNrYWdlcyBhbmQgbmFtZXNwYWNlcy48L2NtZD48L3N1YnN0ZXA+DQotPC9zdWJzdGVwcz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5XZWIgU2VydmljZSBDbGllbnQgVGVzdCBwYWdlOiBVc2UgdGhpcyBwYWdlIHRvIHNlbGVjdCB0aGUgZm9sbG93aW5nDQotb3B0aW9uczogPC9jbWQ+DQotPHN1YnN0ZXBzPg0KLTxzdWJzdGVwPjxjbWQ+U2VsZWN0IHlvdXIgdGVzdCBmYWNpbGl0eS4gWW91IGNhbiB0ZXN0IHRoZSBnZW5lcmF0ZWQgcHJveHkNCi1pbiB0aGUgV2ViIFNlcnZpY2UgRXhwbG9yZXIsIG9yIHRoZSBVbml2ZXJzYWwgVGVzdCBDbGllbnQuPC9jbWQ+PC9zdWJzdGVwPg0KLTxzdWJzdGVwPjxjbWQ+U2VsZWN0ICA8dWljb250cm9sPlJ1biB0ZXN0IG9uIHNlcnZlcjwvdWljb250cm9sPiB0byBzdGFydCB0aGUNCi1zZXJ2ZXIgZm9yIHlvdSBhdXRvbWF0aWNhbGx5LjwvY21kPjwvc3Vic3RlcD4NCi08L3N1YnN0ZXBzPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPldlYiBTZXJ2aWNlIFB1YmxpY2F0aW9uIHBhZ2U6IElmIHlvdSBoYXZlIHNlbGVjdGVkIHRvIHB1Ymxpc2ggeW91cg0KLVdlYiBzZXJ2aWNlIHRvIGEgVURESSByZWdpc3RyeSwgdXNlIHRoaXMgcGFnZSB0byBsYXVuY2ggdGhlIFdlYiBTZXJ2aWNlcyBFeHBsb3Jlcg0KLWFuZCBzZWxlY3QgdGhlIFVEREkgcmVnaXN0cnkgdG8gd2hpY2ggdGhlIFdlYiBzZXJ2aWNlIHdpbGwgYmUgcHVibGlzaGVkLiBDbGljaw0KLSA8dWljb250cm9sPkZpbmlzaDwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPC9zdGVwcz4NCi08cmVzdWx0IGNvbnJlZj0idGF4aXMyYnUuZGl0YSN0d3NiZWFuYS9heGlzd3NjcmVhdGVyZXN1bHQiPkFmdGVyIHRoZSBXZWIgc2VydmljZQ0KLWhhcyBiZWVuIGNyZWF0ZWQsIHRoZSBmb2xsb3dpbmcgbWF5IG9jY3VyIGRlcGVuZGluZyBvbiB0aGUgb3B0aW9ucyB5b3Ugc2VsZWN0ZWQ6IDx1bD4NCi08bGk+SWYgeW91IGhhdmUgc2VsZWN0ZWQgdG8gdGVzdCB0aGUgZ2VuZXJhdGVkIHByb3h5IHVzaW5nIFdlYiBzZXJ2aWNlIEpTUHMsDQotdGhlIHByb3h5IGlzIGxhdW5jaGVkIGluIGEgV2ViIGJyb3dzZXIgYXQgdGhlIGZvbGxvd2luZyBVUkw6IDxjb2RlcGg+aHR0cDovL2xvY2FsaG9zdDogPHZhcm5hbWU+cG9ydDwvdmFybmFtZT4vIDx2YXJuYW1lPldlYlByb2plY3Q8L3Zhcm5hbWU+Q2xpZW50L3NhbXBsZTxpDQotPkJlYW5OYW1lPC9pPi88dmFybmFtZT5XZWJTZXJ2aWNlTmFtZTwvdmFybmFtZT4vVGVzdENsaWVudC5qc3A8L2NvZGVwaD4gWW91DQotY2FuIHVzZSB0aGlzIHNhbXBsZSBhcHBsaWNhdGlvbiB0byB0ZXN0IHRoZSBXZWIgc2VydmljZSBieSBzZWxlY3RpbmcgYSBtZXRob2QsDQotZW50ZXJpbmcgYSB2YWx1ZSBmb3IgdGhlIG1ldGhvZCwgYW5kIGNsaWNraW5nICA8dWljb250cm9sPkludm9rZTwvdWljb250cm9sPi4NCi1UaGUgcmVzdWx0IG9mIHRoZSBtZXRob2Qgd2lsbCBkaXNwbGF5IGluIHRoZSByZXN1bHRzIHBhbmUuPC9saT4NCi08bGk+SWYgeW91IGhhdmUgc2VsZWN0ZWQgdG8gdGVzdCB0aGUgV2ViIHNlcnZpY2UgdXNpbmcgdGhlIFdlYiBTZXJ2aWNlcyBFeHBsb3JlciwNCi10aGUgRXhwbG9yZXIgd2lsbCBvcGVuLiBTZWxlY3QgdGhlIG9wZXJhdGlvbiB5b3Ugd2FudCB0byB0ZXN0LCBlbnRlciB0aGUgcmVxdWlyZWQNCi1pbmZvcm1hdGlvbiwgYW5kIGNsaWNrICA8Yj5HbzwvYj4uIFRoZSByZXN1bHQgd2lsbCBkaXNwbGF5IGluIHRoZSBTdGF0dXMgcGFuZS48L2xpPg0KLTxsaT5JZiB5b3UgaGF2ZSBzZWxlY3RlZCB0byBwdWJsaXNoIHRoZSBXZWIgc2VydmljZSwgdGhlIFdlYiBTZXJ2aWNlcyBFeHBsb3Jlcg0KLWlzIGxhdW5jaGVkIGRpc3BsYXlpbmcgdGhlIHBhZ2UgcmVxdWlyZWQgdG8gcHVibGlzaCB5b3VyIFdlYiBzZXJ2aWNlLiBGb2xsb3cNCi10aGUgaW5zdHJ1Y3Rpb25zIGluIDx2YXJuYW1lPlB1Ymxpc2hpbmcgdGhlIFdlYiBzZXJ2aWNlPC92YXJuYW1lPiB0byBjb21wbGV0ZQ0KLXRoaXMgdGFzay48L2xpPg0KLTwvdWw+PC9yZXN1bHQ+DQotPC90YXNrYm9keT4NCi08cmVsYXRlZC1saW5rcz4NCi08bGlua2xpc3Q+PHRpdGxlPlJlbGF0ZWQgQ29uY2VwdHM8L3RpdGxlPg0KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC53cy5kb2MudXNlci9jb25jZXB0cy9jd3NpbndzYS5kaXRhIiBzY29wZT0icGVlciI+DQotPGxpbmt0ZXh0PiBUb29scyBmb3IgV2ViIHNlcnZpY2VzIGRldmVsb3BtZW50PC9saW5rdGV4dD48L2xpbms+DQotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LndzLmRvYy51c2VyL2NvbmNlcHRzL2N3cy5kaXRhIiBzY29wZT0icGVlciI+DQotPGxpbmt0ZXh0PldlYiBzZXJ2aWNlcyBkZXZlbG9wbWVudDwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua2xpc3Q+DQotPGxpbmtsaXN0Pjx0aXRsZT5SZWxhdGVkIFRhc2tzPC90aXRsZT4NCi08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Qud3MuZG9jLnVzZXIvdGFza3MvdG92ZXJ3cy5kaXRhIiBzY29wZT0icGVlciI+DQotPGxpbmt0ZXh0PiBEZXZlbG9waW5nIFdlYiBzZXJ2aWNlczwvbGlua3RleHQ+PC9saW5rPg0KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5kb2MudXNlci90YXNrcy90dWRkaWV4cC5kaXRhIg0KLXNjb3BlPSJwZWVyIj48bGlua3RleHQ+IFVzaW5nIHRoZSBXZWIgU2VydmljZXMgRXhwbG9yZXI8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtsaXN0Pg0KLTwvcmVsYXRlZC1saW5rcz4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDc4NDI/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyL3RvcGljcy90YXhpczJ0ZC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvdG9waWNzL3RheGlzMnRkLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3MWVlYjguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvdG9waWNzL3RheGlzMnRkLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ3JlYXRpbmcgYSBKYXZhIGJlYW4gc2tlbGV0b24gZnJvbSBhIFdTREwgZG9jdW1lbnQgdXNpbmcgdGhlIEFwYWNoZSBBeGlzMiBydW50aW1lIGVudmlyb25tZW50IiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IlRoZSBXZWIgc2VydmljZSB3aXphcmQgYXNzaXN0cyB5b3UgaW4gY3JlYXRpbmcgYSBza2VsZXRvbiBiZWFuIGZyb20gYW4gZXhpc3RpbmcgV1NETCBkb2N1bWVudC4gVGhlIHNrZWxldG9uIGJlYW4gY29udGFpbnMgYSBzZXQgb2YgbWV0aG9kcyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIG9wZXJhdGlvbnMgZGVzY3JpYmVkIGluIHRoZSBXU0RMIGRvY3VtZW50LiBXaGVuIHRoZSBiZWFuIGlzIGNyZWF0ZWQsIGVhY2ggbWV0aG9kIGhhcyBhIHRyaXZpYWwgaW1wbGVtZW50YXRpb24gdGhhdCB5b3UgcmVwbGFjZSBieSBlZGl0aW5nIHRoZSBiZWFuLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJUaGUgV2ViIHNlcnZpY2Ugd2l6YXJkIGFzc2lzdHMgeW91IGluIGNyZWF0aW5nIGEgc2tlbGV0b24gYmVhbiBmcm9tIGFuIGV4aXN0aW5nIFdTREwgZG9jdW1lbnQuIFRoZSBza2VsZXRvbiBiZWFuIGNvbnRhaW5zIGEgc2V0IG9mIG1ldGhvZHMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSBvcGVyYXRpb25zIGRlc2NyaWJlZCBpbiB0aGUgV1NETCBkb2N1bWVudC4gV2hlbiB0aGUgYmVhbiBpcyBjcmVhdGVkLCBlYWNoIG1ldGhvZCBoYXMgYSB0cml2aWFsIGltcGxlbWVudGF0aW9uIHRoYXQgeW91IHJlcGxhY2UgYnkgZWRpdGluZyB0aGUgYmVhbi4iIC8+Ci08bWV0YSBjb250ZW50PSJBeGlzMiBydW50aW1lIGVudmlyb25tZW50LCBza2VsZXRvbiBXZWIgc2VydmljZXMsIFdlYiBzZXJ2aWNlcywgc2tlbGV0b24gV2ViIHNlcnZpY2VzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iQXhpczIgcnVudGltZSBlbnZpcm9ubWVudCwgc2tlbGV0b24gV2ViIHNlcnZpY2VzLCBXZWIgc2VydmljZXMsIHNrZWxldG9uIFdlYiBzZXJ2aWNlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jYXhpczJ0b3Zlci5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Qud3MuZG9jLnVzZXIvY29uY2VwdHMvY3dzaW53c2EuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LndzLmRvYy51c2VyL2NvbmNlcHRzL2N3cy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Qud3MuZG9jLnVzZXIvdGFza3MvdG92ZXJ3cy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkuZG9jLnVzZXIvdGFza3MvdHVkZGlleHAuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0c2tsd3NkbGEiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5DcmVhdGluZyBhIEphdmEgYmVhbiBza2VsZXRvbiBmcm9tIGEgV1NETCBkb2N1bWVudCB1c2luZyB0aGUKLUFwYWNoZSBBeGlzMiBydW50aW1lIGVudmlyb25tZW50PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0c2tsd3NkbGEiPjxhIG5hbWU9InRza2x3c2RsYSI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRpbmcgYSBKYXZhIGJlYW4gc2tlbGV0b24gZnJvbSBhIFdTREwgZG9jdW1lbnQgdXNpbmcgdGhlIEFwYWNoZQotQXhpczIgcnVudGltZSBlbnZpcm9ubWVudDwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+VGhlIFdlYiBzZXJ2aWNlIHdpemFyZCBhc3Npc3RzIHlvdSBpbiBjcmVhdGluZyBhIHNrZWxldG9uIGJlYW4KLWZyb20gYW4gZXhpc3RpbmcgV1NETCBkb2N1bWVudC4gVGhlIHNrZWxldG9uIGJlYW4gY29udGFpbnMgYSBzZXQgb2YgbWV0aG9kcwotdGhhdCBjb3JyZXNwb25kIHRvIHRoZSBvcGVyYXRpb25zIGRlc2NyaWJlZCBpbiB0aGUgV1NETCBkb2N1bWVudC4gV2hlbiB0aGUKLWJlYW4gaXMgY3JlYXRlZCwgZWFjaCBtZXRob2QgaGFzIGEgdHJpdmlhbCBpbXBsZW1lbnRhdGlvbiB0aGF0IHlvdSByZXBsYWNlCi1ieSBlZGl0aW5nIHRoZSBiZWFuLjwvcD4KLQotPGRpdiBjbGFzcz0icCI+PHA+UHJlcmVxdWlzaXRlczo8L3A+Ci08b2w+Ci08bGk+WW91IG11c3QgaGF2ZSBpbnN0YWxsZWQgdGhlIEFwYWNoZSBBeGlzMiBydW50aW1lCi1lbnZpcm9ubWVudCBhcyBkZXNjcmliZWQgaW46IDxhIGhyZWY9ImNheGlzMnRvdmVyLmh0bWwiIHRpdGxlPSJUaGlzIHJ1bnRpbWUgZW52aXJvbm1lbnQgaXMgZm9yIHVzZXJzIHdobyBwcmVmZXIgdG8gZGV2ZWxvcCBmb3ImIzEwO3RoZSBvcGVuIEFwYWNoZSBBeGlzIHBsYXRmb3JtLiBCb3RoIEF4aXMxIGFuZCBBeGlzMiBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBXZWImIzEwO3NlcnZpY2VzIHRvb2xzLiI+Q3JlYXRpbmcgV2ViIHNlcnZpY2VzIHdpdGggdGhlIEFwYWNoZSBBeGlzMiBydW50aW1lIGVudmlyb25tZW50czwvYT48L2xpPgotCi08bGk+SWYgeW91IGFyZSB1c2luZyB0aGUgQXBhY2hlIEpha2FydGEgVG9tY2F0IHNlcnZsZXQKLWNvbnRhaW5lciBhcyB5b3VyIHNlcnZlciwgeW91IG11c3QgaW5zdGFsbCBpdCwgY29uZmlndXJlIGFuIGluc3RhbmNlIG9mIGl0LAotYW5kIGNyZWF0ZSBhIFdlYiBwcm9qZWN0IHRhcmdldGVkIHRvIGl0IGFzIGRlc2NyaWJlZCBpbjogPGEgaHJlZj0iLi4vb3JnLmVjbGlwc2UuanN0LndzLmF4aXMudWkuZG9jLnVzZXIvdG9waWNzL3R0b21jYXRzZXJ2Lmh0bWwiPkNyZWF0aW5nIGFuIEFwYWNoZSBUb21jYXQgc2VydmVyIGFuZCBXZWIgcHJvamVjdDwvYT48L2xpPgotCi08bGk+Q3JlYXRlIG9yIGltcG9ydCBhIFdTREwgZmlsZSBpbnRvIHRoZSBXZWIgQ29udGVudCBmb2xkZXIgb2YgdGhlIFdlYiBwcm9qZWN0LgotWW91IGNhbiBvbmx5IHVzZSBhIFdTREwgZmlsZSB0aGF0IGNvbnRhaW5zIGEgc2VydmljZSBlbGVtZW50LjwvbGk+Ci0KLTwvb2w+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+VG8gY3JlYXRlIGEgV2ViIHNlcnZpY2UgZnJvbSBhIFdTREwgZmlsZSB1c2luZyB0aGUgQXBhY2hlIEF4aXMyIHJ1bnRpbWUKLWVudmlyb25tZW50OjwvZGl2PgotCi08b2w+Ci08bGk+PHNwYW4+U3dpdGNoIHRvIHRoZSBKMkVFIHBlcnNwZWN0aXZlICg8c3BhbiBjbGFzcz0idWljb250cm9sIj5XaW5kb3cgJmd0OyBPcGVuIFBlcnNwZWN0aXZlCi0mZ3Q7IEoyRUU8L3NwYW4+KS48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkluIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHZpZXcsIHNlbGVjdCB0aGUgV1NETCBmaWxlIHRoYXQgeW91IGNyZWF0ZWQKLW9yIGltcG9ydGVkIGludG8gdGhlIFdlYiBDb250ZW50IGZvbGRlciBvZiB5b3VyIFdlYiBwcm9qZWN0Ljwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+Q2xpY2sgIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbGUgJmd0OyBOZXcgJmd0OyBPdGhlcjwvc3Bhbj4uIFNlbGVjdCAgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2ViCi1TZXJ2aWNlczwvc3Bhbj4gaW4gb3JkZXIgdG8gZGlzcGxheSB0aGUgdmFyaW91cyBXZWIgc2VydmljZSB3aXphcmRzLgotU2VsZWN0IHRoZSAgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2ViIFNlcnZpY2U8L3NwYW4+IHdpemFyZC4gQ2xpY2sgIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5leHQ8L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaT48c3Bhbj5XZWIgU2VydmljZXMgcGFnZTogc2VsZWN0ICA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Ub3AgZG93biBKYXZhIGJlYW4gV2ViIHNlcnZpY2U8L3NwYW4+IGFzCi15b3VyIFdlYiBzZXJ2aWNlIHR5cGUsIGFuZCBlbnRlciB0aGUgVVJJIHRvIHRoZSBXU0RMLCBXU0lMLCBvciBIVE1MIGZpbGUgdGhhdAotd2lsbCBiZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBzZXJ2aWNlLjwvc3Bhbj4KLTxvbCB0eXBlPSJhIj4KLTxsaSBjbGFzcz0ic3Vic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IHRoZSBzdGFnZXMgb2YgV2ViIHNlcnZpY2VzIGRldmVsb3BtZW50IHRoYXQgeW91IHdhbnQKLXRvIGNvbXBsZXRlIHVzaW5nIHRoZSBzbGlkZXI6PC9zcGFuPiA8dWw+Ci08bGk+RGV2ZWxvcDogdGhpcyB3aWxsIGRldmVsb3AgdGhlIFdTREwgZGVmaW5pdGlvbiBhbmQgaW1wbGVtZW50YXRpb24gb2YgdGhlCi1XZWIgc2VydmljZS4gVGhpcyBpbmNsdWRlcyBzdWNoIHRhc2tzIGFzIGNyZWF0aW5nIHRoZSBtb2R1bGVzIHdoaWNoIHdpbGwgY29udGFpbgotdGhlIGdlbmVyYXRlZCBjb2RlLCBXU0RMIGZpbGVzLCBkZXBsb3ltZW50IGRlc2NyaXB0b3JzLCBhbmQgSmF2YeKEoiBmaWxlcwotd2hlbiBhcHByb3ByaWF0ZS48L2xpPgotCi08bGk+QXNzZW1ibGU6IHRoaXMgZW5zdXJlcyB0aGUgcHJvamVjdCB0aGF0IHdpbGwgaG9zdCB0aGUgV2ViIHNlcnZpY2Ugb3IgY2xpZW50Ci1nZXRzIGFzc29jaWF0ZWQgdG8gYW4gRUFSIHdoZW4gcmVxdWlyZWQgYnkgdGhlIHRhcmdldCBhcHBsaWNhdGlvbiBzZXJ2ZXIuPC9saT4KLQotPGxpPkRlcGxveTogdGhpcyB3aWxsIGNyZWF0ZSB0aGUgZGVwbG95bWVudCBjb2RlIGZvciB0aGUgc2VydmljZS48L2xpPgotCi08bGk+SW5zdGFsbDogdGhpcyB3aWxsIGluc3RhbGwgYW5kIGNvbmZpZ3VyZSB0aGUgV2ViIG1vZHVsZSBhbmQgRUFScyBvbiB0aGUKLXRhcmdldCBzZXJ2ZXIuPC9saT4KLQotPGxpPlN0YXJ0OiB0aGlzIHdpbGwgc3RhcnQgdGhlIHNlcnZlciBvbmNlIHRoZSBzZXJ2aWNlIGhhcyBiZWVuIGluc3RhbGxlZAotb24gaXQuIFRoZSBzZXJ2ZXItY29uZmlnLndzZGQgZmlsZSB3aWxsIGJlIGdlbmVyYXRlZC48L2xpPgotCi08bGk+VGVzdDogdGhpcyB3aWxsIHByb3ZpZGUgdmFyaW91cyBvcHRpb25zIGZvciB0ZXN0aW5nIHRoZSBzZXJ2aWNlLCBzdWNoCi1hcyB1c2luZyB0aGUgV2ViIFNlcnZpY2UgRXhwbG9yZXIgb3Igc2FtcGxlIEpTUHMuPC9saT4KLQotPC91bD4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3Vic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IHlvdXIgc2VydmVyOiB0aGUgZGVmYXVsdCBzZXJ2ZXIgaXMgZGlzcGxheWVkLiBJZiB5b3UKLXdhbnQgdG8gZGVwbG95IHlvdXIgc2VydmljZSB0byBhIGRpZmZlcmVudCBzZXJ2ZXIgY2xpY2sgdGhlIGxpbmsgdG8gc3BlY2lmeQotYSBkaWZmZXJlbnQgc2VydmVyLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN1YnN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCB5b3VyIHJ1bnRpbWU6IGVuc3VyZSB0aGUgQXBhY2hlIEF4aXMyIHJ1bnRpbWUgaXMgc2VsZWN0ZWQuPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdWJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgdGhlIHNlcnZpY2UgcHJvamVjdDogdGhlIHByb2plY3Qgc2VsZWN0ZWQgaW4geW91ciB3b3Jrc3BhY2UKLWlzIGRpc3BsYXllZC4gVG8gc2VsZWN0IGEgZGlmZmVyZW50IHByb2plY3QgY2xpY2sgb24gdGhlIHByb2plY3QgbGluay4gSWYKLXlvdSBhcmUgZGVwbG95aW5nIHRvIFdlYlNwaGVyZTxzdXA+wq48L3N1cD4gQXBwbGljYXRpb24gU2VydmVyIHlvdSB3aWxsIGFsc28gYmUgYXNrZWQKLXRvIHNlbGVjdCB0aGUgRUFSIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvamVjdC48L3NwYW4+IEVuc3VyZSB0aGF0IHRoZQotcHJvamVjdCBzZWxlY3RlZCBhcyB0aGUgQ2xpZW50IFdlYiBQcm9qZWN0IGlzIGRpZmZlcmVudCBmcm9tIHRoZSBTZXJ2aWNlIFdlYgotUHJvamVjdCwgb3IgdGhlIHNlcnZpY2Ugd2lsbCBiZSBvdmVyd3JpdHRlbiBieSB0aGUgY2xpZW50J3MgZ2VuZXJhdGVkIGFydGlmYWN0cy4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3Vic3RlcGV4cGFuZCI+PHNwYW4+SWYgeW91IHdhbnQgdG8gY3JlYXRlIGEgY2xpZW50LCBzZWxlY3QgdGhlIHR5cGUgb2YgcHJveHkgdG8KLWJlIGdlbmVyYXRlZCBhbmQgcmVwZWF0IHRoZSBhYm92ZSBzdGVwcyBmb3IgdGhlIGNsaWVudC48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdWJzdGVwZXhwYW5kIj48c3Bhbj5QdWJsaXNoIHRoZSBXZWIgc2VydmljZTogdGhpcyB3aWxsIGxhdW5jaCB0aGUgV2ViIFNlcnZpY2VzIEV4cGxvcmVyCi10byBwdWJsaXNoIHlvdXIgV2ViIHNlcnZpY2UgdG8gYSBVRERJIHJlZ2lzdHJ5Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN1YnN0ZXBleHBhbmQiPjxzcGFuPk1vbml0b3IgdGhlIFdlYiBzZXJ2aWNlOiB0aGlzIHdpbGwgc2VuZCB0aGUgV2ViIHNlcnZpY2UgdHJhZmZpYwotdGhyb3VnaCB0aGUgVENQL0lQIE1vbml0b3IsIHdoaWNoIGFsbG93cyB5b3UgdG8gd2F0Y2ggdGhlIFNPQVAgdHJhZmZpYyBnZW5lcmF0ZWQKLWJ5IHRoZSBXZWIgc2VydmljZSBhbmQgdG8gdGVzdCB0aGlzIHRyYWZmaWMgZm9yIFdTLUkgY29tcGxpYW5jZS4gQWx0ZXJuYXRlbHkKLXlvdSBjYW4gbWFudWFsbHkgc2V0IHVwIGEgVENQL0lQIG1vbml0b3IgYXMgZGVzY3JpYmVkIGluIDxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC53c2kudWkuZG9jLnVzZXIvdGFza3MvdG1vbml0b3IuaHRtbCI+VXNpbmcgdGhlIFRDUC9JUCBNb25pdG9yIHRvIHRlc3QgV2ViIHNlcnZpY2VzPC9hPjwvc3Bhbj48L2xpPgotCi08L29sPgotCi08L2xpPgotCi08bGk+PHNwYW4+QXhpczIgV2ViIFNlcnZpY2UgU2tlbGV0b24gSmF2YSBCZWFuIENvbmZpZ3VyYXRpb24gcGFnZTogU2VsZWN0IHRoZQotZm9sZGVyIHdoZXJlIHRoZSBnZW5lcmF0ZWQgSmF2YSB3aWxsIGJlIHN0b3JlZC4gSWYgeW91IHdhbnQgdG8gcmV2aWV3Ci1vciBlZGl0IHRoZSBtYXBwaW5ncyBiZXR3ZWVuIHBhY2thZ2VzIGFuZCBuYW1lc3BhY2VzLCBzZWxlY3QgdGhlICA8c3BhbiBjbGFzcz0idWljb250cm9sIj5EZWZpbmUKLWN1c3RvbSBtYXBwaW5nIGZvciBuYW1lc3BhY2UgdG8gcGFja2FnZTwvc3Bhbj4gY2hlY2sgYm94LiBDbGljayAgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj4uPC9zcGFuPgotPG9sIHR5cGU9ImEiPgotPGxpPjxzcGFuPlNlcnZpY2UgTmFtZTogYWNjZXB0IHRoZSBkZWZhdWx0Ljwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+UG9ydCBOYW1lOmFjY2VwdCB0aGUgZGVmYXVsdC48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkRhdGFiaW5kaW5nIE5hbWU6IE9ubHkgdGhlIEF4aXMyIERhdGFiaW5kaW5nIEZyYW1ld29yayAoQURCKQotaXMgc3VwcG9ydGVkIGF0IHRoaXMgdGltZS48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkN1c3RvbSBwYWNrYWdlIG5hbWU6IFlvdSBjYW4gY2hhbmdlIHRoZSBwYWNrYWdlIG5hbWUgaW4gdGhpcwotZmllbGQuPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5HZW5lcmF0ZSBhbiBJbnRlcmZhY2UgZm9yIFNrZWxldG9uPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5HZW5lcmF0ZSBhbGwgdHlwZXMgZm9yIGFsbCBlbGVtZW50cyByZWZlcnJlZCBieSBzY2hlbWFzPC9zcGFuPgotPC9saT4KLQotPGxpPjxzcGFuPk5hbWVzcGFjZSB0byBwYWNrYWdlIG1hcHBpbmc6IFVzZSB0aGlzIHRhYmxlIHRvIHJldmlldyBvciBlZGl0Ci10aGUgbWFwcGluZ3MgYmV0d2VlbiBwYWNrYWdlcyBhbmQgbmFtZXNwYWNlcy48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPC9saT4KLQotPGxpPjxzcGFuPlRlc3QgV2ViIFNlcnZpY2UgcGFnZTogSWYgeW91IHNlbGVjdGVkIHRvIHRlc3QgdGhlIFdlYiBzZXJ2aWNlLAotc2VsZWN0IHRoZSB0ZXN0IGZhY2lsaXR5IGZvciB0aGUgZ2VuZXJhdGVkIFdlYiBzZXJ2aWNlLiBUaGlzIHdpbGwgb3BlbiB0aGUKLVdlYiBzZXJ2aWNlIGluIHRoZSBXZWIgU2VydmljZXMgRXhwbG9yZXIuIFNlbGVjdCB0aGUgb3BlcmF0aW9uIHlvdSB3YW50IHRvCi10ZXN0LCBlbnRlciB0aGUgcmVxdWlyZWQgaW5mb3JtYXRpb24sIGFuZCBjbGljayAgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+R288L3NwYW4+LgotVGhlIHJlc3VsdCB3aWxsIGRpc3BsYXkgaW4gdGhlIFN0YXR1cyBwYW5lLiBDbGljayAgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPGxpPjxzcGFuPkF4aXMyIENsaWVudCBXZWIgc2VydmljZSBjb25maWd1cmF0aW9uCi1wYWdlOiBVc2UgdGhpcyBwYWdlIHRvIHNlbGVjdCB0aGUgZm9sbG93aW5nIG9wdGlvbnM6IDwvc3Bhbj4KLTxvbCB0eXBlPSJhIj4KLTxsaT48c3Bhbj5TZXJ2aWNlIE5hbWU6IGFjY2VwdCB0aGUgZGVmYXVsdC48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPlBvcnQgTmFtZTogYWNjZXB0IHRoZSBkZWZhdWx0Ljwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+RGF0YWJpbmRpbmcgTmFtZTogb25seSB0aGUgQXhpczIgRGF0YWJpbmRpbmcgRnJhbWV3b3JrIChBREIpCi1pcyBzdXBwb3J0ZWQgYXQgdGhpcyB0aW1lLjwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+Q3VzdG9tIHBhY2thZ2UgbmFtZTogWW91IGNhbiBjaGFuZ2UgdGhlIHBhY2thZ2UgbmFtZSBpbiB0aGlzCi1maWVsZC48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkNsaWVudCBtb2RlOiBZb3UgY2FuIGNob29zZSBpZiB0aGUgY2xpZW50IGlzIHN5bmNocm9ub3VzLCBhc3luY2hyb25vdXMsCi1vciBib3RoLjwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+R2VuZXJhdGUgdGVzdCBjYXNlIHRvIHRlc3QgdGhlIHNlcnZpY2U6IElmIHlvdSBzZWxlY3QgdGhpcywKLXRoZSBBeGlzMiBlbWl0dGVyIHdpbGwgZ2VuZXJhdGUgSlVuaXQgdGVzdGNhc2VzIG1hdGNoaW5nIHRoZSBXU0RMIHByb3ZpZGVkCi10byB0aGUgY2xpZW50LiBUaGVzZSBKVW5pdCB0ZXN0Y2FzZXMgd2lsbCBiZSBnZW5lcmF0ZWQgdG8gYSBuZXdseSBhZGRlZCBzb3VyY2UKLWRpcmVjdG9yeSB0byB0aGUgY2xpZW50IHByb2plY3QgY2FsbGVkIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPnRlc3Q8L3NwYW4+LiA8L3NwYW4+Ci08L2xpPgotCi08bGk+PHNwYW4+R2VuZXJhdGUgYWxsIHR5cGVzIGZvciBhbGwgZWxlbWVudHMgcmVmZXJyZWQgYnkgc2NoZW1hczwvc3Bhbj4KLTwvbGk+Ci0KLTxsaT48c3Bhbj5OYW1lc3BhY2UgdG8gcGFja2FnZSBtYXBwaW5nOiBVc2UgdGhpcyB0YWJsZSB0byByZXZpZXcgb3IgZWRpdAotdGhlIG1hcHBpbmdzIGJldHdlZW4gcGFja2FnZXMgYW5kIG5hbWVzcGFjZXMuPC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTwvbGk+Ci0KLTxsaT48c3Bhbj5XZWIgU2VydmljZSBDbGllbnQgVGVzdCBwYWdlOiBVc2UgdGhpcyBwYWdlIHRvIHNlbGVjdCB0aGUgZm9sbG93aW5nCi1vcHRpb25zOiA8L3NwYW4+Ci08b2wgdHlwZT0iYSI+Ci08bGk+PHNwYW4+U2VsZWN0IHlvdXIgdGVzdCBmYWNpbGl0eS4gWW91IGNhbiB0ZXN0IHRoZSBnZW5lcmF0ZWQgcHJveHkKLWluIHRoZSBXZWIgU2VydmljZSBFeHBsb3Jlciwgb3IgdGhlIFVuaXZlcnNhbCBUZXN0IENsaWVudC48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPlNlbGVjdCAgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UnVuIHRlc3Qgb24gc2VydmVyPC9zcGFuPiB0byBzdGFydCB0aGUKLXNlcnZlciBmb3IgeW91IGF1dG9tYXRpY2FsbHkuPC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTwvbGk+Ci0KLTxsaT48c3Bhbj5XZWIgU2VydmljZSBQdWJsaWNhdGlvbiBwYWdlOiBJZiB5b3UgaGF2ZSBzZWxlY3RlZCB0byBwdWJsaXNoIHlvdXIKLVdlYiBzZXJ2aWNlIHRvIGEgVURESSByZWdpc3RyeSwgdXNlIHRoaXMgcGFnZSB0byBsYXVuY2ggdGhlIFdlYiBTZXJ2aWNlcyBFeHBsb3JlcgotYW5kIHNlbGVjdCB0aGUgVURESSByZWdpc3RyeSB0byB3aGljaCB0aGUgV2ViIHNlcnZpY2Ugd2lsbCBiZSBwdWJsaXNoZWQuIENsaWNrCi0gPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmluaXNoPC9zcGFuPi48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGRpdiBjbGFzcz0icCI+QWZ0ZXIgdGhlIFdlYiBzZXJ2aWNlIGhhcyBiZWVuIGNyZWF0ZWQsCi10aGUgZm9sbG93aW5nIG1heSBvY2N1ciBkZXBlbmRpbmcgb24gdGhlIG9wdGlvbnMgeW91IHNlbGVjdGVkOiA8dWw+Ci08bGk+SWYgeW91IGhhdmUgc2VsZWN0ZWQgdG8gdGVzdCB0aGUgV2ViIHNlcnZpY2UgdXNpbmcgdGhlIFdlYiBTZXJ2aWNlcyBFeHBsb3JlciwKLXRoZSBFeHBsb3JlciB3aWxsIG9wZW4uIFNlbGVjdCB0aGUgb3BlcmF0aW9uIHlvdSB3YW50IHRvIHRlc3QsIGVudGVyIHRoZSByZXF1aXJlZAotaW5mb3JtYXRpb24sIGFuZCBjbGljayAgPHN0cm9uZz5Hbzwvc3Ryb25nPi4gVGhlIHJlc3VsdCB3aWxsIGRpc3BsYXkgaW4gdGhlIFN0YXR1cyBwYW5lLjwvbGk+Ci0KLTxsaT5JZiB5b3UgaGF2ZSBzZWxlY3RlZCB0byBwdWJsaXNoIHRoZSBXZWIgc2VydmljZSwgdGhlIFdlYiBTZXJ2aWNlcyBFeHBsb3JlcgotaXMgbGF1bmNoZWQgZGlzcGxheWluZyB0aGUgcGFnZSByZXF1aXJlZCB0byBwdWJsaXNoIHlvdXIgV2ViIHNlcnZpY2UuIEZvbGxvdwotdGhlIGluc3RydWN0aW9ucyBpbiAgPHZhciBjbGFzcz0idmFybmFtZSI+UHVibGlzaGluZyB0aGUgV2ViIHNlcnZpY2U8L3Zhcj4gdG8gY29tcGxldGUKLXRoaXMgdGFzay48L2xpPgotCi08L3VsPgotPC9kaXY+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iLi4vdG9waWNzL2NheGlzMnRvdmVyLmh0bWwiIHRpdGxlPSJUaGlzIHJ1bnRpbWUgZW52aXJvbm1lbnQgaXMgZm9yIHVzZXJzIHdobyBwcmVmZXIgdG8gZGV2ZWxvcCBmb3IgdGhlIG9wZW4gQXBhY2hlIEF4aXMgcGxhdGZvcm0uIEJvdGggQXhpczEgYW5kIEF4aXMyIGFyZSBzdXBwb3J0ZWQgYnkgdGhlIFdlYiBzZXJ2aWNlcyB0b29scy4iPkNyZWF0aW5nIFdlYiBzZXJ2aWNlcyB3aXRoIHRoZSBBcGFjaGUgQXhpczIgcnVudGltZSBlbnZpcm9ubWVudHM8L2E+PC9kaXY+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ibGlua2xpc3QiPjxzdHJvbmc+UmVsYXRlZCBDb25jZXB0czwvc3Ryb25nPjxiciAvPgotCi08ZGl2PjxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC53cy5kb2MudXNlci9jb25jZXB0cy9jd3NpbndzYS5odG1sIj4gVG9vbHMgZm9yIFdlYiBzZXJ2aWNlcyBkZXZlbG9wbWVudDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LndzLmRvYy51c2VyL2NvbmNlcHRzL2N3cy5odG1sIj5XZWIgc2VydmljZXMgZGV2ZWxvcG1lbnQ8L2E+PC9kaXY+PC9kaXY+Ci0KLTxkaXYgY2xhc3M9ImxpbmtsaXN0Ij48c3Ryb25nPlJlbGF0ZWQgVGFza3M8L3N0cm9uZz48YnIgLz4KLQotPGRpdj48YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Qud3MuZG9jLnVzZXIvdGFza3MvdG92ZXJ3cy5odG1sIj4gRGV2ZWxvcGluZyBXZWIgc2VydmljZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5kb2MudXNlci90YXNrcy90dWRkaWV4cC5odG1sIj4gVXNpbmcgdGhlIFdlYiBTZXJ2aWNlcyBFeHBsb3JlcjwvYT48L2Rpdj48L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvd3NheGlzMl9yZWx0YWJsZV90b2MuZGl0YW1hcCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyL3dzYXhpczJfcmVsdGFibGVfdG9jLmRpdGFtYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNWI0NTguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvd3NheGlzMl9yZWx0YWJsZV90b2MuZGl0YW1hcAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgbWFwIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIE1hcC8vRU4iDQotICJtYXAuZHRkIj4NCi08bWFwIGlkPSJheGlzMndlYnNlcnZpY2VzcmVsdGFibGUiIHRpdGxlPSJSZWx0YWJsZSBmb3IgQXhpcyBXZWIgc2VydmljZXMgZG9jcyI+DQotPHJlbHRhYmxlPg0KLTxyZWxoZWFkZXI+DQotPHJlbGNvbHNwZWMgdHlwZT0iY29uY2VwdCI+PC9yZWxjb2xzcGVjPg0KLTxyZWxjb2xzcGVjIHR5cGU9InRhc2siPjwvcmVsY29sc3BlYz4NCi08cmVsY29sc3BlYyB0eXBlPSJyZWZlcmVuY2UiPjwvcmVsY29sc3BlYz4NCi08L3JlbGhlYWRlcj4NCi08cmVscm93Pg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2NheGlzMnRvdmVyLmRpdGEiIG5hdnRpdGxlPSJDcmVhdGluZyBXZWIgc2VydmljZXMgd2l0aCB0aGUgQXBhY2hlIEF4aXMyIHJ1bnRpbWUgZW52aXJvbm1lbnQiPg0KLTwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGF4aXMyYnUuZGl0YSIgbmF2dGl0bGU9IkNyZWF0aW5nIGFuIEF4aXMyIFdlYiBzZXJ2aWNlIGZyb20gYSBKYXZhIGJlYW4iPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YXhpczJ0ZC5kaXRhIiBuYXZ0aXRsZT0iQ3JlYXRpbmcgYW4gQXhpczIgV2ViIHNlcnZpY2UgZnJvbSBXU0RMIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGF4aXMyY2xpZW50LmRpdGEiIG5hdnRpdGxlPSJDcmVhdGluZyBhbiBBeGlzMiBXZWIgc2VydmljZSBjbGllbnQiPg0KLTwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08L3JlbHJvdz4NCi08cmVscm93Pg0KLTxyZWxjZWxsPg0KLTx0b3BpY3JlZiBocmVmPSIuLi9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy51aS5kb2MudXNlci90b3BpY3MvY2F4aXN0b3Zlci5kaXRhIg0KLW5hdnRpdGxlPSJDcmVhdGluZyBXZWIgc2VydmljZXMgd2l0aCB0aGUgQXBhY2hlIEF4aXMxIHJ1bnRpbWUgZW52aXJvbm1lbnQiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jYXhpczJ0b3Zlci5kaXRhIiBuYXZ0aXRsZT0iQ3JlYXRpbmcgV2ViIHNlcnZpY2VzIHdpdGggdGhlIEFwYWNoZSBBeGlzMiBydW50aW1lIGVudmlyb25tZW50Ij4NCi08L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTwvcmVsdGFibGU+DQotPC9tYXA+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvd3NheGlzMmJ1aWxkX3RvYy5kaXRhbWFwIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvd3NheGlzMmJ1aWxkX3RvYy5kaXRhbWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWUxYjMxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyL3dzYXhpczJidWlsZF90b2MuZGl0YW1hcAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgbWFwIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIE1hcC8vRU4iDQotICJtYXAuZHRkIj4NCi08bWFwIGFuY2hvcnJlZj0iLi4vb3JnLmVjbGlwc2UuanN0LndzLmRvYy51c2VyL3dzY3JlYXRpb250MV90b2MuZGl0YW1hcCN3c2F4aXMiDQotaWQ9IndzYXhpcyIgdGl0bGU9IndzYXhpcyI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jYXhpczJ0b3Zlci5kaXRhIiBuYXZ0aXRsZT0iQXBhY2hlIEF4aXMyIHJ1bnRpbWUiIHRvYz0ieWVzIj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RheGlzMmJ1LmRpdGEiIG5hdnRpdGxlPSJDcmVhdGluZyBhIFdlYiBzZXJ2aWNlIGZyb20gYSBKYXZhIGJlYW4gdXNpbmcgdGhlIEFwYWNoZSBBeGlzMiBydW50aW1lIGVudmlyb25tZW50Ig0KLXNjb3BlPSJsb2NhbCI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RheGlzMnRkLmRpdGEiIG5hdnRpdGxlPSJDcmVhdGluZyBhIEphdmEgYmVhbiBza2VsZXRvbiBmcm9tIGEgV1NETCBkb2N1bWVudCB1c2luZyB0aGUgQXBhY2hlIEF4aXMyIHJ1bnRpbWUgZW52aXJvbm1lbnQiDQotc2NvcGU9ImxvY2FsIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGF4aXMyY2xpZW50LmRpdGEiIG5hdnRpdGxlPSJHZW5lcmF0aW5nIGEgSmF2YSBjbGllbnQgcHJveHkgYW5kIGEgc2FtcGxlIGFwcGxpY2F0aW9uIGZyb20gYSBXU0RMIGRvY3VtZW50IHVzaW5nIHRoZSBBeGlzMiBydW50aW1lIGVudmlyb25tZW50Ig0KLXNjb3BlPSJsb2NhbCI+PC90b3BpY3JlZj4NCi08L3RvcGljcmVmPg0KLTwvbWFwPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyL3dzYXhpczJidWlsZF90b2MueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvd3NheGlzMmJ1aWxkX3RvYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZWFmZDIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvd3NheGlzMmJ1aWxkX3RvYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotCi08dG9jIGxpbmtfdG89Ii4uL29yZy5lY2xpcHNlLmpzdC53cy5kb2MudXNlci93c2NyZWF0aW9udDFfdG9jLnhtbCN3c2F4aXMiIGxhYmVsPSJ3c2F4aXMiIHRvcGljPSJ0b3BpY3MvY2F4aXMydG92ZXIuaHRtbCI+Ci08dG9waWMgbGFiZWw9IkNyZWF0aW5nIFdlYiBzZXJ2aWNlcyB3aXRoIHRoZSBBcGFjaGUgQXhpczIgcnVudGltZSBlbnZpcm9ubWVudHMiIGhyZWY9InRvcGljcy9jYXhpczJ0b3Zlci5odG1sIj4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYSBXZWIgc2VydmljZSBmcm9tIGEgSmF2YSBiZWFuIHVzaW5nIHRoZSBBcGFjaGUgQXhpczIgcnVudGltZSBlbnZpcm9ubWVudCIgaHJlZj0idG9waWNzL3RheGlzMmJ1Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYSBKYXZhIGJlYW4gc2tlbGV0b24gZnJvbSBhIFdTREwgZG9jdW1lbnQgdXNpbmcgdGhlIEFwYWNoZSBBeGlzMiBydW50aW1lIGVudmlyb25tZW50IiBocmVmPSJ0b3BpY3MvdGF4aXMydGQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJHZW5lcmF0aW5nIGEgSmF2YSBjbGllbnQgcHJveHkgYW5kIGEgc2FtcGxlIGFwcGxpY2F0aW9uIGZyb20gYSBXU0RMIGRvY3VtZW50IHVzaW5nIHRoZSBBeGlzMiBydW50aW1lIGVudmlyb25tZW50IiBocmVmPSJ0b3BpY3MvdGF4aXMyY2xpZW50Lmh0bWwiLz4KLTwvdG9waWM+Ci08L3RvYz4K